특정 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 문은 저장 프로 시저 내에서 지원되지 않습니다.
어떻게 해결할 수 있습니까?
SQL 문은 열 이름과 0을 기본값으로 반환합니다. 그렇지 않은 경우 그 열에 행이있는 것과 같은 수의 값을 가지므로 그 값은 아무 것도 얻지 못하게됩니다. 행이 없습니다. 문제를 해결하는 방법에 대한 아이디어가 있습니까? 문제는 프로 시저 코드가 아닌 – Barbara
인데 스토어드 프로 시저의 목표는 무엇입니까? 당신은 데이터베이스/tablename에 전달하고 출력/당신을 제공하기로되어 있습니까? – weinp
목표는 결과 집합 구조를 "columnName", 0으로 가져 오는 것입니다. 따라서 프로 시저에서는 문자열을 쿼리 인 것처럼 읽어야합니다. 이것은 특정 dbname 및 테이블 이름이 주어진 경우 사용 가능한 모든 열 이름에 대해 해당 문자열을 반복하여 수행해야합니다. 그러나 나는 내가 재현 부분을 제대로 만들지 못했다고 생각한다. – Barbara