【问题标题】:Dynamic sql invalid relational operator动态sql无效的关系运算符
【发布时间】:2020-11-18 16:30:15
【问题描述】:

由于无效的关系运算符错误,我有下面的匿名块,并且在执行立即 str 字符串之前失败。

不明白为什么。

SET SERVEROUT ON ;

DECLARE
   SRCE_SB_CATGRY_ID   VARCHAR2 (1000);
BEGIN
   FOR i
      IN (SELECT ISO_CNTRY_ID, X.COLUMN_NAME
            FROM iso_cntry I,
                 (SELECT DISTINCT COLUMN_NAME
                    FROM ALL_tab_cols@suplr_md_qa2
                   WHERE     table_name = 'TEMP_ARIBA'
                         AND COLUMN_NAME != 'SSC_ID') x
           WHERE ISO_CNTRY_DESC_TXT LIKE '' || COLUMN_NAME || '%')
   LOOP
      DECLARE
         str1   VARCHAR2 (10000)
            :=    ' SELECT DISTINCT ssc_id  '
               || ' FROM stddata_suplr.temp_ariba@suplr_md_qa2 '
               || ' WHERE '
               || ' '
               || i.column_name
               || ' = ''Y'' ';
         x      SYS_REFCURSOR;
      BEGIN
         OPEN x FOR str1;

         LOOP
            FETCH x INTO SRCE_SB_CATGRY_ID;

            EXIT WHEN x%NOTFOUND;



            NULL;
         END LOOP;
      END;
   END LOOP;

   END;

【问题讨论】:

  • 我没有发现任何明显的问题。一种可能性是您的列名之一具有要求将其括在双引号中的字符。我建议你在打开游标之前添加DBMS_OUTPUT.PUT_LINE(str1),这样你就可以准确地看到你正在尝试执行的SQL。
  • 嗨戴夫,非常感谢您对此的回复,我已经按照您的建议进行操作,但没有结果,我使用执行立即执行相同但相同的错误。
  • 嗨 Belayer,它抛出无效的关系运算符,当我在 str 中传递硬编码值而不是 i.column_name 时,它​​可以工作,但不能使用 i.column_name,我将此字符串放在 dbms_output 中,并且所有生成的语句都是有效的......

标签: sql oracle plsql


【解决方案1】:

您不应该在匿名块中使用两次声明部分。

试试这个:

SET SERVEROUT ON ;

DECLARE
   SRCE_SB_CATGRY_ID   VARCHAR2 (1000);
   str1   VARCHAR2 (10000);
   x      SYS_REFCURSOR;
BEGIN
   FOR i
      IN (SELECT ISO_CNTRY_ID, X.COLUMN_NAME
            FROM iso_cntry I,
                 (SELECT DISTINCT COLUMN_NAME
                    FROM ALL_tab_cols@suplr_md_qa2
                   WHERE     table_name = 'TEMP_ARIBA'
                         AND COLUMN_NAME != 'SSC_ID') x
           WHERE ISO_CNTRY_DESC_TXT LIKE '' || COLUMN_NAME || '%')
   LOOP
         str1 :=    ' SELECT DISTINCT ssc_id  '
               || ' FROM stddata_suplr.temp_ariba@suplr_md_qa2 '
               || ' WHERE '
               || ' '
               || i.column_name
               || ' = ''Y'' ';
         
         OPEN x FOR str1;

         LOOP
            FETCH x INTO SRCE_SB_CATGRY_ID;

            EXIT WHEN x%NOTFOUND;



            NULL;
         END LOOP;
      END;
   END LOOP;

   END;

请根据您的要求管理逻辑。

【讨论】:

  • 您好 Tejas,感谢您的建议,但仍然显示相同的错误。
  • 删除除str1赋值以外的所有内容,检查动态查询本身是否有错误。
【解决方案2】:

行驶中的这条线看起来不对:

WHERE ISO_CNTRY_DESC_TXT LIKE '' || COLUMN_NAME || '%'

尝试不连接前导引号:

WHERE ISO_CNTRY_DESC_TXT LIKE COLUMN_NAME || '%'

【讨论】:

  • 嗨 Apc ,将您的建议放在脚本中,但仍然无法正常工作并抛出相同的错误
【解决方案3】:

非常感谢您的所有建议。这是 iso_cntry_id 之一的数据错误。我在 where 子句中过滤了它,现在它工作正常。

我在第一个循环中所做的更改

FOR i
      IN (SELECT ISO_CNTRY_ID, X.COLUMN_NAME
            FROM iso_cntry I,
                 (SELECT DISTINCT COLUMN_NAME
                    FROM ALL_tab_cols@suplr_md_qa2
                   WHERE table_name = 'TEMP_ARIBA') x
           WHERE     ISO_CNTRY_DESC_TXT LIKE '' || COLUMN_NAME || '%'
                 AND i.ISO_CNTRY_ID != 18)
   LOOP

最好的问候, 维杰

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-15
    • 2014-09-17
    • 2018-08-07
    • 1970-01-01
    • 2014-03-25
    • 2020-02-07
    • 1970-01-01
    相关资源
    最近更新 更多