动态sql编译但无法执行

时间:2014-02-10 21:41:21

标签: sql oracle plsql

我正在尝试使用动态sql(立即执行)显示重复记录。我收到'指定超过30个字符的标识符'错误。我对动态sql做错了什么?

 CREATE OR REPLACE PROCEDURE FIND_DUP(P_TABLE IN VARCHAR2, P_COLUMN IN VARCHAR2)
    AS
    stmt_txt varchar2(4000);
    BEGIN
     stmt_txt:= 'select' 
                      ||p_column
                      || 'from' 
                      ||p_table
                      || 'group by' 
                      ||p_column
                      ||'having count(*)>1';

     execute immediate stmt_txt;
    end;
    /

    EXECUTE FIND_DUP('EMPLOYEES','FIRST_NAME');

2 个答案:

答案 0 :(得分:6)

您在查询中遗漏了一些空格。

stmt_txt:= 'select ' 
              ||p_column
              || ' from ' 
              ||p_table
              || ' group by ' 
              ||p_column
              ||' having count(*)>1';

如果没有空格,您的查询最终会以selectFIRST_NAMEfromEMPLOYEESgroup byFIRST_NAMEhaving count(*)>1结尾,而Oracle看起来就像是一个超过30个字符的标识符。

答案 1 :(得分:0)

您在使用动态SQL时应首先考虑的第一件事就是始终打印生成的sql,因为它可以让您了解正在运行的查询。这段代码可能会帮助您解决查询问题,因为您几乎完成了所有操作,只有在缺少某些空格时才会这样做。

    CREATE OR REPLACE
    PROCEDURE FIND_DUP(
        P_TABLE  IN VARCHAR2,
        P_COLUMN IN VARCHAR2)
    AS
      stmt_txt VARCHAR2(4000);
    BEGIN
      stmt_txt:= 'select' ||' ' ||p_column ||' ' ||'from' ||' ' ||p_table;
      EXECUTE immediate stmt_txt;
      DBMS_OUTPUT.PUT_LINE(STMT_TXT);
    END;


For the output 

BEGIN
  FIND_DUP('DUAL','SYSTIMESTAMP');
END;

---------------------------------------------------------------------------

OUTPUT

select SYSTIMESTAMP from DUAL

Statement processed.

0.01 seconds
---------------------------------------------------------------------------