如何逃避圆括号'('在SQL中?

时间:2017-09-27 17:03:53

标签: oracle plsql

我正在尝试使用引用游标进行sql查询,但我想我错过了>转义符号。我已经逃过了'''但我不确定>圆括号。

我在open ref_cursor语句中收到“international_flag:invalid identifier”错误。我已经尝试了一些东西来逃避括号,因为我认为这就是为什么它没有选择变量international_flag。任何线索都会非常感激。

declare
international_flag          varchar2(4) := 'Y';
term_code       varchar(8) := '201709';
type stu_ref_cursor is      ref cursor;
ref_cursor                  stu_ref_cursor;
ref_cursor_select_statement varchar2(1000);

begin
ref_cursor_select_statement := 
    'Select
        CONFID_MSG,
        ETHNIC_CODE,
        STUDENT_NAME,
        POTSDAM_ID(STUDENT_PIDM),
        CLASS,
        LEVL_CODE,
        AGE,
        BIRTHDATE,
        fp_get_coll_box(STUDENT_PIDM),
        f_get_on_campus_email_addr(STUDENT_PIDM),
        RESD_IND,
        STUDENT_PIDM,
        REG_HRS,
        SGB_TERM_ADMIT,
        GENDER
        From  SEM_REG_STUDENT_NONGPA
        Where REG_TERM = term_code
              And STATUS = ''AS''
              And REG_TERM_STATUS = ''Y''
              And 
                 (
                   international_flag = ''N''
                   Or
                    (international_flag = ''Y'' And f_international_student_natn(STUDENT_PIDM) Is Not NULL)
                   Or
                    (international_flag = ''U'' and CITIZEN = ''Y'')  
                 )
        Order By STUDENT_NAME';

    open ref_cursor for ref_cursor_select_statement;

    end;

2 个答案:

答案 0 :(得分:2)

这不是你如何在动态SQL中引用PL / SQL变量。您需要使用前缀为冒号的占位符,并为变量提供USING子句。这可能意味着重复,在这种情况下,您会多次使用相同的变量。您需要放入三个占位符并将相同的变量传递三次(即USING international_flag,international_flag,international_flag)

DECLARE
   TYPE EmpCurTyp IS REF CURSOR;  -- define weak REF CURSOR type
   emp_cv   EmpCurTyp;  -- declare cursor variable
   my_ename VARCHAR2(15);
   my_sal   NUMBER := 1000;
BEGIN
   OPEN emp_cv FOR  -- open cursor variable
      'SELECT ename, sal FROM emp WHERE sal > :s' USING my_sal;
   ...
END;

PS。最好为变量添加前缀(通常使用v_但有些人为本地而g_为全局等)以使更明显的是什么是列以及什么是变量。

答案 1 :(得分:0)

动态sql的优点在于你永远不会知道错误,因为它只会产生运行时错误。在构造动态sql之前,应该正确检查变量的绑定。这里有两个变量,如“TERM_CODE”和“INTERNTIONAL_FLAG”。希望以下片段有所帮助。

DECLARE
  international_flag VARCHAR2(4) := 'Y';
  TERM_CODE          VARCHAR(8)  := '201709';
    ref_cursor  sys_refcursor;
    ref_cursor_select_statement VARCHAR2(1000);
  BEGIN
    ref_cursor_select_statement := 'Select                
                                    CONFID_MSG,                
                                    ETHNIC_CODE,                
                                    STUDENT_NAME,                
                                    POTSDAM_ID(STUDENT_PIDM),                
                                    CLASS,                
                                    LEVL_CODE,                
                                    AGE,                
                                    BIRTHDATE,                
                                    fp_get_coll_box(STUDENT_PIDM),                
                                    f_get_on_campus_email_addr(STUDENT_PIDM),                
                                    RESD_IND,                
                                    STUDENT_PIDM,                
                                    REG_HRS,                
                                    SGB_TERM_ADMIT,                
                                    GENDER                
                                    From  SEM_REG_STUDENT_NONGPA                
                                    Where REG_TERM = '''||term_code||'''                      
                                    And STATUS = ''AS''                      
                                    And REG_TERM_STATUS = ''Y''                      
                                    And                          
                                    ('''|| international_flag||''' = ''N''                           
                                    Or                            
                                    ('''||international_flag||''' = ''Y'' And f_international_student_natn(STUDENT_PIDM) Is Not NULL)                           
                                    Or                            
                                    ('||
                                        international_flag||' = ''U'' and CITIZEN = ''Y'')                           
                                    )                
                                    Order By STUDENT_NAME';
    OPEN ref_cursor FOR ref_cursor_select_statement;
  END;
  /