【问题标题】:Missing right parenthesis error in EXECUTE IMMEDIATE statementEXECUTE IMMEDIATE 语句中缺少右括号错误
【发布时间】:2021-11-20 12:47:24
【问题描述】:

我创建了一个包并在另一个匿名块中调用它的过程。当我调用该过程时,缺少右括号错误。我不断收到此错误,但没有发现任何缺少的括号。

    CREATE OR REPLACE PACKAGE BODY downloadInterface
AS
   PROCEDURE getList (
      pitxt_cc             IN     stand_value.val01%TYPE,
      pitxt_language       IN     stand_value.language%TYPE,
      piint_pn             IN     prt_req.pol_n%TYPE DEFAULT NULL,
      piint_cn             IN     prt_req.cal_no%TYPE DEFAULT NULL,
      piint_ctn            IN     prt_req.nm_id_no%TYPE DEFAULT NULL,
      potab_doc_list          OUT custDocTab,
      potxt_message_id        OUT error_det.ERROR_CODE%TYPE,
      potxt_message_text      OUT error_det.ERROR_TEXT%TYPE,
      potxt_error_text        OUT error_det.ERROR_TEXT%TYPE)
   AS
      ltxt_SQL_TYPE_stmt   VARCHAR2 (32000 CHAR);
      ltxt_SQL_stmt_f      VARCHAR2 (32000 CHAR);
      ltxt_SQL_stmt_s      VARCHAR2 (32000 CHAR);
      ltxt_SQL_stmt_t      VARCHAR2 (32000 CHAR);
      lint_error_log_id    error_det.error_id%TYPE;
      lint_agnt_id         gnw_cla_user_reg.agnt_id%TYPE;
      ltxt_group_id        gnw_cla_user_reg.GROUP_ID%TYPE;
   BEGIN
      potab_doc_list := NEW custDocTab ();



      ltxt_SQL_stmt_f :=
         'SELECT ci.pol_n,
       p.c01  agr_no,
       ci.cal_no,
       ci.nm_id_no,
       NULL emailId,
       ''TIT'' doc_det,
       ci.reqt_Id,
       pr.reqt_emode reque_status,
       ci.event_type eventType,
       ci.wrt_date docprtDate,
       pr.reqt_date docreqtDate,
       pr.prt_job prtJob,
       (pr.tter_salut || '' '' || pr.addressee || '', '' || pr.area_code)
          addressee,
       pr.language language,
       ci.prgm_id tterId,
       ci.file_name prtFile,
       pp.description file_name,
       lc.val08 description,
       lc.val07 document_type,
       fn.val02 orig_filename,
       fn.val03 TYPE,
       fn.val06 friendly_filename,
       fn.val07 friendly_type,
       fn.val08 scope,
       NVL (fn.val06, ''Generic Title'')  title,
       pp.business_area,
       (SELECT description
          FROM stand_value_cb
         WHERE     table_name =''BUSINESS_AREA''
               AND language = :pitxt_language
               AND code = pp.business_area)
          ba_description,
       pp.activity,
       (SELECT description
          FROM stand_value_cb
         WHERE     table_name = ''ACTIVITY''
               AND language = :pitxt_language
               AND code = pp.activity)
          act_description
  FROM event_item ci,
       prt_prgm pp,
       polcy p,
       prt_req pr,
       (SELECT *
          FROM stand_value  
         WHERE     table_name = ''DOC_NAMES''
               AND language = :pitxt_language) fn,
       (SELECT DISTINCT table_name,
                        val03,
                        val07,
                        val08
          FROM stand_value
         WHERE table_name = ''tter_CONFIGURATION'') lc, ';

      ltxt_SQL_stmt_s := '  WHERE     ci.tter_location = ''DISK''
       AND ci.prgm_id = pp.prgm_id
       AND ci.event_type = ''LTOT''
       AND ci.pol_n = p.pol_n
       AND p.pre_seq_no IS NULL
       AND ci.reqt_id = pr.reqt_id
       AND pp.prgm_id = lc.val03
       AND pp.prgm_id = fn.val04(+)
       AND  fn.val08 IS NOT NULL';



      ltxt_SQL_TYPE_stmt :=
         '  SELECT custDocTab
                                                    (   polcyNumber
                                                     ,  alan
                                                     ,  clmNumber
                                                     ,  cstmNumber
                                                     ,  emailId
                                                     ,  docSource
                                                     ,  reqtId
                                                     ,  reqtStatus
                                                     ,  eventType
                                                     ,  docprtDate
                                                     ,  docreqtDate
                                                     ,  prtJob
                                                     ,  addressee
                                                     ,  language
                                                     ,  tterId
                                                     ,  prtFile
                                                     ,  file_name
                                                     ,  description
                                                     ,  document_type
                                                     ,  orig_filename
                                                     ,  type
                                                     ,  friendly_filename
                                                     ,  friendly_type
                                                     ,  scope
                                                    )
                                     FROM (';


      IF piint_cust_no IS NOT NULL
      THEN
         SELECT agnt_id, GROUP_ID
           INTO lint_agnt_id, ltxt_group_id
           FROM gnw_cla_user_reg
          WHERE id_no = piint_cust_no;


         IF (generic_cl.iseIvalpl (pitxt_cc         => pitxt_cc,
                                        piint_agnt_Id    => lint_agnt_id,
                                        pitxt_group_id   => ltxt_group_id))
         THEN
            cript_idt.set_cript_idt (
               pitxt_cc             => pitxt_cc,
               pinum_id_no_orig     => piint_cust_no,
               piint_agnt_id        => lint_agnt_id,
               pitxt_group_id       => ltxt_group_id,
               potxt_message_id     => potxt_message_id,
               potxt_message_text   => potxt_message_text,
               potxt_error_text     => potxt_error_text);

            IF ( (potxt_message_id || potxt_message_text || potxt_error_text)
                   IS NOT NULL)
            THEN
               -- Abort.
               RETURN;
            END IF;


            ltxt_SQL_stmt_t :=
               ' AND ci.nm_id_no = nt.id_no(+) 
                    AND nt.id_no = :piint_cust_no
                    AND pp.business_area = 
                    event                                                    
                        WHEN fn.val07 = ''Claims'' THEN ''CL''
                        WHEN fn.val07 = ''polcy'' THEN ''PO''
                    END)';

            EXECUTE IMMEDIATE
                  ltxt_SQL_TYPE_stmt
               || ltxt_SQL_stmt_f
               || 'name_idt nt'
               || ltxt_SQL_stmt_s
               || ltxt_SQL_stmt_t
               BULK COLLECT INTO potab_doc_list
               USING IN pitxt_language,
                     pitxt_language,
                     pitxt_language,
                     piint_cust_no;
         ELSE
            EXECUTE IMMEDIATE
                  ltxt_SQL_TYPE_stmt
               || ltxt_SQL_stmt_f
               || 'name_dup nt'
               || ltxt_SQL_stmt_s
               || ltxt_SQL_stmt_t
               BULK COLLECT INTO potab_doc_list
               USING IN pitxt_language,
                     pitxt_language,
                     pitxt_language,
                     piint_cust_no;
         END IF;
      ELSIF piint_pol_n IS NOT NULL AND piint_cal_no IS NULL
      THEN
         EXECUTE IMMEDIATE
               ltxt_SQL_TYPE_stmt
            || ltxt_SQL_stmt_f
            || 'name_dup nt'
            || ltxt_SQL_stmt_s
            || 'and ci.pol_n = :piint_pol_n
       and pp.business_area = ''PO''
       AND ci.cal_no is null)'
            BULK COLLECT INTO potab_doc_list
            USING IN pitxt_language,
                  pitxt_language,
                  pitxt_language,
                  piint_pol_n;
      ELSIF piint_cal_no IS NOT NULL
      THEN
         EXECUTE IMMEDIATE
               ltxt_SQL_TYPE_stmt
            || ltxt_SQL_stmt_f
            || 'name_dup'
            || ltxt_SQL_stmt_s
            || 'and ci.pol_n = :piint_cal_no)'
            BULK COLLECT INTO potab_doc_list
            USING IN pitxt_language,
                  pitxt_language,
                  pitxt_language,
                  piint_cal_no;
      END IF;
   EXCEPTION
      WHEN OTHERS
      THEN
         z_error ('Error while fetching documents =' || SQLERRM);


         potxt_message_id := 'GCDDIGDL009';

         lint_error_log_id :=
            utl_gss.save_error (ptxt_cc           => pitxt_cc,
                                ptxt_error_code   => potxt_message_id,
                                ptxt_error_text   => potxt_message_text);
         potxt_error_text :=
            utl_gss.format_fatal_error (
               pint_error_log_id   => lint_error_log_id);
   END getList;
END downloadInterface;
/

用于调用丢失括号错误的过程的块

DECLARE
   potab_doc_listt       custDocTab;
   potxt_message_idt     error_det.ERROR_CODE%TYPE;
   potxt_message_textt   error_det.ERROR_TEXT%TYPE;
   potxt_error_textt     error_det.ERROR_TEXT%TYPE;
BEGIN
   downloadInterface.getList ('KL',
                              'AIA',
                              NULL,
                              NULL,
                              521749999,
                              potab_doc_listt,
                              potxt_message_idt,
                              potxt_message_textt,
                              potxt_error_textt);
END;

错误

ORA-20210: generic_cl.iseIvalpl Error while fetching documents =ORA-00907: missing right parenthesis
ORA-06512: at "Z_ERROR", line 60
ORA-06512: at "downloadInterface", line 226
ORA-06512: at line 9

将日志放在几个地方后,我发现错误首先出现在EXECUTE IMMEDIATE 语句,即下面的语句

EXECUTE IMMEDIATE
                  ltxt_SQL_TYPE_stmt
               || ltxt_SQL_stmt_f
               || 'name_idt nt'
               || ltxt_SQL_stmt_s
               || ltxt_SQL_stmt_t
               BULK COLLECT INTO potab_doc_list
               USING IN pitxt_language,
                     pitxt_language,
                     pitxt_language,
                     piint_cust_no;

【问题讨论】:

  • 您是否尝试将其归结为 minimal 可重现的示例?
  • 您应该更好地使用现代 ANSI 连接语法,而不是旧的 Oracle 连接语法。在执行命令之前,在命令字符串上使用DBMS_OUTPUT.PUT_LINE(...)。错误似乎很明显。

标签: oracle plsql dynamic-sql


【解决方案1】:

动态 SQL 很难,因为它将编译错误转化为运行时错误。这就是这里发生的事情。您的 SQL 块一旦组装就会生成无效的 SQL。

调试动态 SQL 令人头疼。您应该为整个语句设置一个变量,然后使用 DBMS_OUTPUT.PUT_LINE 将整个内容打印到屏幕上。这样可以更容易地发现语法上的Bloomer。

或者,将语句编写为静态 SQL,确保它们运行,然后将它们变成块。

最后,您可以免费获得这个。当编译器可能期待 CASE 时,分配给 ltxt_SQL_stmt_t 的字符串包含单词 EVENT。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-31
    • 1970-01-01
    • 2021-05-06
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 2015-01-19
    • 1970-01-01
    相关资源
    最近更新 更多