我正在尝试使用动态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');
答案 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
---------------------------------------------------------------------------