【问题标题】:execute Insert into query in a variable in procedure在过程中的变量中执行插入查询
【发布时间】:2017-04-12 17:40:28
【问题描述】:

我在变量中有一个 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;';

我需要将此选择查询的输出插入到表 ERR_DUP_CHK 中。我正在尝试执行此操作

execute immediate 'INSERT INTO UTI_ERR_DUP_CHK SQL_STMT3';

但它没有执行。请帮助我。

【问题讨论】:

  • 您收到什么错误信息?还是它只是挂起?还是返回不正确的输出?

标签: oracle-sqldeveloper


【解决方案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;
/

您可能应该在插入中包含目标表列名。您可能还想重新考虑将日期作为字符串存储在该目标表中。

【讨论】:

  • @PavaniSrujana - 您在动态查询的末尾有一个分号,在您正在形成的字符串内。那不应该在那里,并导致 ORA-00911 错误。
猜你喜欢
  • 2023-03-19
  • 2018-01-17
  • 1970-01-01
  • 1970-01-01
  • 2022-07-05
  • 1970-01-01
  • 1970-01-01
  • 2022-11-03
  • 2016-10-03
相关资源
最近更新 更多