【发布时间】:2016-02-25 03:45:40
【问题描述】:
我在包中创建了一个动态查询,例如:
QUERY_STR := 'SELECT DISTINCT :1
FROM schema_name.'|| P_TABLE_NAME||' where UPPER(:2) NOT IN (SELECT UPPER(LOOKUP_STG.LOOKUP_CODE)
from XX_LOOKUP_EXT LOOKUP_STG where UPPER(:3)=upper(LOOKUP_CODE)
and LOOKUP_STG.LOOKUP_TYPE=''' || P_LOOKUP_TYPE || ''') ;';
我正在尝试执行的操作
declare
P_TABLE_NAME varchar2(100):='XXHR_STG';
P_LOOKUP_TYPE varchar2(100):='PER_SUPERVISOR_TYPE';
p_column VARCHAR2(100):='manager_type';
begin
XX_LOOKUP_VALIDATION.XX_VALIDATION_LOOKUP(P_TABLE_NAME,P_LOOKUP_TYPE,p_column);
end;
实际上在 query_str 中 p_lookup_type 应该用引号括起来:
SELECT DISTINCT manager_type
FROM schema_name.XXHR_STG
where UPPER(MANAGER_TYPE) NOT IN
(SELECT UPPER(LOOKUP_STG.LOOKUP_CODE)
from XX_LOOKUP_EXT LOOKUP_STG where UPPER(MANAGER_TYPE)=upper(LOOKUP_CODE)
and LOOKUP_STG.LOOKUP_TYPE='PER_SUPERVISOR_TYPE';
但是在调用包时我得到一个无效字符错误
00911. 00000 - "invalid character"
*Cause: identifiers may not start with any ASCII character other than
letters and numbers. $#_ are also allowed after the first
character. Identifiers enclosed by doublequotes may contain
any character other than a doublequote. Alternative quotes
(q'#...#') cannot use spaces, tabs, or carriage returns as
delimiters. For all other contexts, consult the SQL Language
Reference Manual.
*Action:
dbms 输出:
SELECT DISTINCT :1
FROM schema_name.XXHR_STG
where UPPER(:2) NOT IN
(select UPPER(LOOKUP_STG.LOOKUP_CODE)
from XX_LOOKUP_EXT LOOKUP_STG where UPPER(:3)=UPPER(LOOKUP_CODE)
and LOOKUP_STG.LOOKUP_TYPE='PER_SUPERVISOR_TYPE';
【问题讨论】:
-
在传递或打开游标之前放置一个 dbms_output.put_line 以显示 QUERY_STR 的值。这将显示 Oracle 正在尝试执行的操作
-
您得到的错误是什么?如果您试图通过将
:1、:2和:3视为绑定变量来通过execute immediate执行query_str,那将不起作用。绑定变量必须是变量而不是列名。 -
@kevinsky - 我已经编辑了我的问题来回答这些问题。谢谢
-
实际的错误是因为你不能使用 :1、:2 和 :3 中的冒号,正如贾斯汀已经说过的那样;或最后的分号。该语句分隔符不应该用于动态语句。不确定它首先抱怨的是哪个。
-
如果您希望
:1、:2和:3是绑定变量,则不能这样做。绑定变量必须是值而不是列名。您必须将列名放在您正在构建的动态 SQL 字符串中。
标签: sql oracle dynamic oracle-sqldeveloper