输出参数值显示为"无效标识符"

Dar*_*rla -2 oracle plsql

我试图从临时创建的表中检索值.但返回值会引发错误"无效标识符"

create or replace procedure edu_stream (input in varchar2,vals out varchar2)
    as
    inp varchar2(30);
    valu varchar2(30);
    begin
    inp:=input;
    if inp='secondary education' then

         Execute immediate'WITH secedu as (
    (SELECT "ICSE" as name FROM dual ) UNION
    (SELECT "CBSE" as name FROM dual ) UNION
    (SELECT "STATE BOARD" as name FROM dual)
    )        
    SELECT name into valu from(SELECT name
        FROM  secedu ORDER BY DBMS_RANDOM.RANDOM)where rownum<2';

        vals:=valu;

    else 
    if inp='intermediate education' then

      Execute immediate'WITH intedu as (
    (SELECT "MPC" as name FROM dual ) UNION
    (SELECT "BIPC" as name FROM dual ) UNION
    (SELECT "MBIPC" as name FROM dual) UNION
    (SELECT "CEC" as name FROM dual)
    )        
    SELECT name into valu from(SELECT name
        FROM intedu ORDER BY DBMS_RANDOM.RANDOM)where rownum<2'; 

        vals:=valu;

        else 
    if inp='Graduation' then

      Execute immediate'WITH gedu as (
    (SELECT "ECE" as name FROM dual ) UNION
    (SELECT "CSE" as name FROM dual ) UNION
    (SELECT "CE" as name FROM dual) UNION
    (SELECT "EEE" as name FROM dual)UNION
    (SELECT "ME" as name FROM dual)UNION
    (SELECT "AE" as name FROM dual)UNION
    (SELECT "BIOTECH" as name FROM dual)UNION
    (SELECT "EIE" as name FROM dual)
    )       
    SELECT name into valu from(SELECT name
        FROM gedu ORDER BY DBMS_RANDOM.RANDOM)where rownum<2'; 

        vals:=valu;


        else 
    if inp='post-graduation' then

      Execute immediate'WITH pgedu as (
    (SELECT "MCA" as name FROM dual ) UNION
    (SELECT "MTECH" as name FROM dual ) UNION
    (SELECT "MSC" as name FROM dual) UNION
    (SELECT "MBA" as name FROM dual)
    )        
    SELECT name into valu from(SELECT name
        FROM pgedu ORDER BY DBMS_RANDOM.RANDOM)where rownum<2'; 

        vals:=valu;

       else 
    if inp='phd'then

     Execute immediate' WITH phdedu as (
    (SELECT "Doctorate of philosophy" as name FROM dual ) UNION
    (SELECT "doctorate of medicine" as name FROM dual ) UNION
    (SELECT "doctorate of science" as name FROM dual) UNION
    (SELECT "Doctorate of computer sciences" as name FROM dual)
    )        
    SELECT name into valu from(SELECT name
        FROM phdgedu ORDER BY DBMS_RANDOM.RANDOM)where rownum<2'; 

        vals:=valu;
    end if;
    end if;
    end if;
    end if;
    end if;
    end;
Run Code Online (Sandbox Code Playgroud)

执行:

declare 
value1 varchar2(30);
cv varchar2(30);
begin
cv:='secondary education';
edu_stream(cv,value1);
dbms_output.put_line('val is'||value1);
end;
Run Code Online (Sandbox Code Playgroud)

错误报告:

在命令的第2行开始出错:declare value1 varchar2(30); cv varchar2(30); 开始cv:='中学教育'; edu_stream(CV,值1); dbms_output.put_line('val is'|| value1); 结束; 错误报告:ORA-00904:"ICSE":无效标识符ORA-06512:在"DATAFOCUS_GROUP.EDU_STREAM",第9行ORA-06512:第6行00904. 00000 - "%s:无效标识符"*原因:
*操作:

如果我使用'ICSE'而不是"ICSE"

错误显示 -

PLS-00103:当遇到以下情况之一时遇到符号"ICSE":
ERROR 103*&= - +; </> at in是mod的余数不是rem返回
返回<>或!=或〜=> = <= <>和/或
类似like2 like4 likec之间使用|| multiset bulk
member submultiset

Ale*_*sej 5

您可以避免动态SQL; 另外,可能是由于动态sql造成的混乱,你使用的是"代替'.您可以将代码重写为:

CREATE OR REPLACE PROCEDURE edu_stream(input IN VARCHAR2, vals OUT VARCHAR2) AS
    inp                                     VARCHAR2(30);
    valu                                    VARCHAR2(30);
BEGIN
    inp    := input;

    IF inp = 'secondary education'
    THEN
        WITH secedu AS
                 ((SELECT 'ICSE' AS name FROM DUAL)
                  UNION
                  (SELECT 'CBSE' AS name FROM DUAL)
                  UNION
                  (SELECT 'STATE BOARD' AS name FROM DUAL))
        SELECT name
          INTO valu
          FROM (  SELECT name
                    FROM secedu
                ORDER BY DBMS_RANDOM.RANDOM)
         WHERE ROWNUM < 2;

        vals    := valu;
    ELSE
        IF inp = 'intermediate education'
        THEN
            WITH intedu AS
                     ((SELECT 'MPC' AS name FROM DUAL)
                      UNION
                      (SELECT 'BIPC' AS name FROM DUAL)
                      UNION
                      (SELECT 'MBIPC' AS name FROM DUAL)
                      UNION
                      (SELECT 'CEC' AS name FROM DUAL))
            SELECT name
              INTO valu
              FROM (  SELECT name
                        FROM intedu
                    ORDER BY DBMS_RANDOM.RANDOM)
             WHERE ROWNUM < 2;

            vals    := valu;
        ELSE
            IF inp = 'Graduation'
            THEN
                WITH gedu AS
                         ((SELECT 'ECE' AS name FROM DUAL)
                          UNION
                          (SELECT 'CSE' AS name FROM DUAL)
                          UNION
                          (SELECT 'CE' AS name FROM DUAL)
                          UNION
                          (SELECT 'EEE' AS name FROM DUAL)
                          UNION
                          (SELECT 'ME' AS name FROM DUAL)
                          UNION
                          (SELECT 'AE' AS name FROM DUAL)
                          UNION
                          (SELECT 'BIOTECH' AS name FROM DUAL)
                          UNION
                          (SELECT 'EIE' AS name FROM DUAL))
                SELECT name
                  INTO valu
                  FROM (  SELECT name
                            FROM gedu
                        ORDER BY DBMS_RANDOM.RANDOM)
                 WHERE ROWNUM < 2;

                vals    := valu;
            ELSE
                IF inp = 'post-graduation'
                THEN
                    WITH pgedu AS
                             ((SELECT 'MCA' AS name FROM DUAL)
                              UNION
                              (SELECT 'MTECH' AS name FROM DUAL)
                              UNION
                              (SELECT 'MSC' AS name FROM DUAL)
                              UNION
                              (SELECT 'MBA' AS name FROM DUAL))
                    SELECT name
                      INTO valu
                      FROM (  SELECT name
                                FROM pgedu
                            ORDER BY DBMS_RANDOM.RANDOM)
                     WHERE ROWNUM < 2;

                    vals    := valu;
                ELSE
                    IF inp = 'phd'
                    THEN
                        WITH phdedu AS
                                 ((SELECT 'Doctorate of philosophy' AS name FROM DUAL)
                                  UNION
                                  (SELECT 'doctorate of medicine' AS name FROM DUAL)
                                  UNION
                                  (SELECT 'doctorate of science' AS name FROM DUAL)
                                  UNION
                                  (SELECT 'Doctorate of computer sciences' AS name FROM DUAL))
                        SELECT name
                          INTO valu
                          FROM (  SELECT name
                                    FROM phdgedu
                                ORDER BY DBMS_RANDOM.RANDOM)
                         WHERE ROWNUM < 2;

                        vals    := valu;
                    END IF;
                END IF;
            END IF;
        END IF;
    END IF;
END;
Run Code Online (Sandbox Code Playgroud)

另外,请注意,变量inpvalu是不是绝对必要的:你可以简单地用参数来检查输入值,并建立输出参数.

如果您需要使用动态SQL(不在这里,但可能在将来),正确的方法是这样的:

declare
    a number;
begin
    execute immediate 'select 1 from dual' into a;
end;
Run Code Online (Sandbox Code Playgroud)