【问题标题】:Unable to run dynamic query in stored procedure while selecting count of records选择记录数时无法在存储过程中运行动态查询
【发布时间】:2014-08-07 06:35:20
【问题描述】:

您好,我想简单地获取源表中的数据计数。

CREATE OR REPLACE PROCEDURE MOVE_CHECK (SCHEMA_SOURCE   IN VARCHAR2,
                                        SCHEMA_TARGET   IN VARCHAR2,
                                        TABLE_SOURCE    IN VARCHAR2,
                                        TABLE_TARGET    IN VARCHAR2,
                                        COLUMN_SOURCE   IN VARCHAR2,
                                        COLUMN_TARGET   IN VARCHAR2)
AS
   A              VARCHAR2 (30);
   B              VARCHAR2 (30);
   C              VARCHAR2 (30);
   D              VARCHAR2 (30);
   E              VARCHAR2 (30);
   F              VARCHAR2 (30);
   Count_source   NUMBER (38);
   TEMP_1         VARCHAR2 (100);
BEGIN
   A := SCHEMA_SOURCE;
   B := SCHEMA_TARGET;
   C := TABLE_SOURCE;
   D := TABLE_TARGET;
   E := COLUMN_SOURCE;
   F := COLUMN_TARGET;

   TEMP_1 :=
      'select count ( ' || E || ' ) into  Count_source   from ' || C || ';';

   DBMS_OUTPUT.PUT_LINE ('STARTED');
   DBMS_OUTPUT.PUT_LINE (TEMP_1);

   EXECUTE IMMEDIATE (TEMP_1);

   DBMS_OUTPUT.PUT_LINE ('source_count:' || Count_source);

   DBMS_OUTPUT.PUT_LINE ('END');
END MOVE_CHECK;

我来了

Connecting to the database 
ORA-00911: invalid character
ORA-06512: at "YDSCST.MOVE_CHECK", line 31
ORA-06512: at line 16

谁能帮我解决这个问题?

我正在尝试编写一个程序来测试所有数据是否完全从源表移动到目标表。

【问题讨论】:

    标签: sql oracle stored-procedures oracle-sqldeveloper


    【解决方案1】:

    您的动态语句末尾不应有分号;这是一个语句分隔符,对单个语句不相关或无效。无论如何,您只能动态运行单个 SQL 语句(除非您将多个语句放入匿名 PL/SQL 块中)。

    你的into 也放错地方了:

    TEMP_1 := 'select count ( '|| E ||' ) from ' || C;
    
    DBMS_OUTPUT.PUT_LINE ('STARTED');
    DBMS_OUTPUT.PUT_LINE (TEMP_1);
    
    EXECUTE IMMEDIATE TEMP_1 INTO Count_source;
    

    当您可以直接使用过程参数时,不知道为什么还要费心拥有和分配局部变量,我认为这使语句更具可读性:

    TEMP_1 := 'select count ( '|| COLUMN_SOURCE ||' ) from ' || TABLE_SOURCE;
    

    【讨论】:

    • 感谢 Alex :) 现在可以使用了。但是当我在 SP 中硬编码 sql 查询时: select count into count_source from 并且 sp 正在工作。
    • 作为一个可以工作的静态查询;作为将获得 ORA-00905 的动态查询。
    猜你喜欢
    • 1970-01-01
    • 2019-08-22
    • 2019-04-08
    • 1970-01-01
    • 1970-01-01
    • 2013-03-12
    • 2017-06-10
    • 2010-12-13
    • 1970-01-01
    相关资源
    最近更新 更多