我在变量中有一个select语句。我需要将此select语句的所有行输出插入另一个表中。我试图在一个程序中实现这一点。 请帮我。 我的代码如下:
CREATE OR REPLACE
PROCEDURE PRC_DUP_CHK(
V_IN_TABLE_NAME IN VARCHAR2,
V_SOURCE_FILE IN VARCHAR2,
v_col IN VARCHAR2,
)
AS
SQL_STMT VARCHAR2(20000);
SQL_STMT3 VARCHAR2(20000);
V_KEY_COL_LIST VARCHAR2(500);
V_KEY_COL_LIST1 VARCHAR2(500);
BEGIN
SELECT UDC_KEY_COLUMNS INTO V_KEY_COL_LIST FROM UTI_DUP_CHK WHERE
UDC_TABLE_NAME=''||V_IN_TABLE_NAME||'';
SELECT REPLACE(V_KEY_COL_LIST,',','||''~''||') INTO V_KEY_COL_LIST1 FROM
DUAL;
SQL_STMT :='SELECT REPLACE(UDC_KEY_COLUMNS,'','',''~'')
FROM UTI_DUP_CHK WHERE UDC_TABLE_NAME='''||V_IN_TABLE_NAME||'''';
SQL_STMT3:='SELECT ('||SQL_STMT||') KEY_COLUMNS,
'||V_KEY_COL_LIST1||' KEY_VALUES,
'''||V_IN_TABLE_NAME||''''||' ODS_TABLE,
'''||V_SOURCE_FILE||''''||' SOURCE_FILE,
TO_CHAR(SYSDATE,''DD-Mon-YYYY HH:MI:SS AM'') LOAD_TIME
FROM (
SELECT DISTINCT '||V_KEY_COL_LIST||',COUNT(*) CNT
FROM '||V_IN_TABLE_NAME||''|| ' WHERE '||V_COL||'>SYSDATE
GROUP BY '||V_KEY_COL_LIST||')A
WHERE A.CNT=1;';
我需要将此select查询的输出插入到表ERR_DUP_CHK中。我正在尝试执行此操作
execute immediate 'INSERT INTO UTI_ERR_DUP_CHK SQL_STMT3';
但它没有执行。请帮助我。
答案 0 :(得分:1)
你正在做的最直接的问题是你需要连接你建立的select语句,而不是将其变量名作为另一个文字的一部分:
execute immediate 'INSERT INTO UTI_ERR_DUP_CHK ' || SQL_STMT3;
您还需要删除动态语句中的分号 - 这就是导致ORA-00911错误的原因:
...
WHERE A.CNT=1'; -- no semicolon inside the string
你可以简化整个过程,例如到:
CREATE OR REPLACE PROCEDURE PRC_DUP_CHK (
V_TABLE_NAME IN VARCHAR2,
V_SOURCE_FILE IN VARCHAR2,
v_COL IN VARCHAR2
)
AS
L_SQL_STMT VARCHAR2(32767);
BEGIN
SELECT 'SELECT ''' || REPLACE(UDC_KEY_COLUMNS, ',', '~') || ''',
' || REPLACE(UDC_KEY_COLUMNS, ',', '||''~''||') || ',
:V_TABLE_NAME,
:SOURCE_FILE,
TO_CHAR(SYSDATE, ''DD-Mon-YYYY HH:MI:SS AM'') LOAD_TIME
FROM ' || V_TABLE_NAME || ' WHERE ' || V_COL || ' > SYSDATE
GROUP BY ' || UDC_KEY_COLUMNS || '
HAVING COUNT(*) = 1'
INTO L_SQL_STMT
FROM UTI_DUP_CHK
WHERE UDC_TABLE_NAME = V_TABLE_NAME;
execute immediate 'INSERT INTO UTI_ERR_DUP_CHK ' || L_SQL_STMT
using V_TABLE_NAME, V_SOURCE_FILE;
END PRC_DUP_CHK;
/
您应该在插入中包含目标表列名称。您可能还想重新考虑将日期作为字符串存储在该目标表中。