【问题标题】:dynamic sql query error due to invalid character [duplicate]由于无效字符导致动态sql查询错误[重复]
【发布时间】: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


【解决方案1】:

问题解决了。我写了“;”在动态查询结束时。不是这样的

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-30
    • 1970-01-01
    • 1970-01-01
    • 2023-01-26
    • 2019-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多