2017-04-21 5 views
0

특정 dbname 및 tablename을 지정하면 해당 테이블에 사용할 수있는 모든 열 이름을 사용하여 select 문 세트를 만드는 dunamic 프로 시저를 만들려고합니다.동적 매개 변수가있는 Teradata 저장 프로 시저

REPLACE PROCEDURE sum_col 
( 
IN TABLENAME VARCHAR(50), DBNAME VARCHAR(286) 
) 

BEGIN 

DECLARE SqlTxt VARCHAR(3000); 

FOR cur AS 

     SELECT 

     TRIM(a.DatabaseName) AS DBNAME, 
     TRIM(a.TABLENAME) AS TABLENAME, 
     TRIM(b.ColumnName) AS ColumnName 

     FROM dbc.Tables a 
     INNER JOIN dbc.COLUMNS AS b 
     ON a.DatabaseName=b.DatabaseName AND a.TABLENAME = b.TABLENAME 

     WHERE a.DatabaseName = :DBNAME 
     AND a.TABLENAME = :TABLENAME 
      AND TableKind = 'T' 


DO 
SET SqlTxt = 'SELECT ' || '''' || TRIM(cur.ColumnName) || '''' || ', CASE 
          WHEN SUM(CNT) IS NULL THEN 0 
          ELSE SUM(CNT) 
          END AS CntNull 

FROM (
SELECT 0 AS cnt  
FROM ' || TRIM(cur.DBNAME) || '.' || TRIM(cur.TABLENAME) ||')a ;'; 

CALL dbc.sysexecsql(:SqlTxt); 

    END FOR; 

END; 

을하지만 문을 호출 할 때이 오류가 얻을 :

나는 다음과 같은 코드를 사용하고 실패 CALL을. [5568] SUM_COL : SQL 문은 저장 프로 시저 내에서 지원되지 않습니다.

어떻게 해결할 수 있습니까?

답변

0

설명 : 이 오류는 다음 상황 중 하나에서 발생합니다. 지원되지 않는 SQL 문은 저장 프로시 듀어의 동적 SQL 기능을 사용하여 저장 프로시 듀어에 지정됩니다. 예를 들어, DATABASE 문, SET SQL 문, 다중 문 요청, FROM 절이없는 CREATE USER/DATABASE 문, SELECT-INTO SQL 또는 CALL SQL. 이것은 런타임 오류입니다.

다른 구문 오류가있는 것 같습니다. 커서를 선언하고 커서 등을여십시오. 더 쉬운 방법으로 목표를 해결할 수 있다고 생각합니다. 정확하게 달성하려는 것은 무엇입니까?

+0

SQL 문은 열 이름과 0을 기본값으로 반환합니다. 그렇지 않은 경우 그 열에 행이있는 것과 같은 수의 값을 가지므로 그 값은 아무 것도 얻지 못하게됩니다. 행이 없습니다. 문제를 해결하는 방법에 대한 아이디어가 있습니까? 문제는 프로 시저 코드가 아닌 – Barbara

+0

인데 스토어드 프로 시저의 목표는 무엇입니까? 당신은 데이터베이스/tablename에 전달하고 출력/당신을 제공하기로되어 있습니까? – weinp

+0

목표는 결과 집합 구조를 "columnName", 0으로 가져 오는 것입니다. 따라서 프로 시저에서는 문자열을 쿼리 인 것처럼 읽어야합니다. 이것은 특정 dbname 및 테이블 이름이 주어진 경우 사용 가능한 모든 열 이름에 대해 해당 문자열을 반복하여 수행해야합니다. 그러나 나는 내가 재현 부분을 제대로 만들지 못했다고 생각한다. – Barbara