Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 输出参数值显示为“无效标识符”_Oracle_Plsql - Fatal编程技术网

Oracle 输出参数值显示为“无效标识符”

Oracle 输出参数值显示为“无效标识符”,oracle,plsql,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 immedi

我正在尝试从临时创建的表中检索值。但返回值抛出错误“无效标识符”

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;
错误报告:

从命令中的第2行开始出错:declare value1 varchar230;个人简历 瓦查尔230;开始简历:=‘中等教育’;edu_streamcv,值1; dbms|u output.put_行'val'is'| | value1;终止错误报告:ORA-00904: ICSE:无效标识符ORA-06512:位于DATAFOCUS_GROUP.EDU_流, 第9行ORA-06512:第6行 90400000-%s:无效标识符 *原因: *行动:

如果我使用“ICSE”而不是ICSE

错误显示-

PLS-00103:在期望一个 以下: 错误103*&=-+;at in是mod余数而不是rem 回来
返回或返回!=或者~=>=您可以避免使用动态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;

作为另一种选择,请坚持使用动态SQL

个人偏好:我总是以“| |”结尾一行,以表明你没有遗漏空格,即使它应该执行得很好

从动态sql中删除into valu,并使其成为执行立即“查询”into VAL子句

例如,我只是使用您的第一个查询:

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 from(SELECT name ' ||
    'FROM  secedu ORDER BY DBMS_RANDOM.RANDOM)where rownum<2'
into vals;

您可能有自己的学习目标,但如果将这些目标放在一边,那么代码就是糟糕的、不必要的、复杂的PL/SQL。下面是对相关Oracle PL/SQL文档的部分但完全功能性的重写。希望您会发现这些想法很有用

-- blocks: http://docs.oracle.com/database/121/LNPLS/overview.htm#LNPLS141
declare
  -- nested tables: http://docs.oracle.com/database/121/LNPLS/composites.htm#LNPLS99981
  type str_list_t is table of varchar2(32767);
  -- subprograms: http://docs.oracle.com/database/121/LNPLS/subprograms.htm#LNPLS008
  -- common parts of f() refactored to r()
  function r(p_list in str_list_t) return varchar2 is
  begin
    return p_list(floor(dbms_random.value(1, p_list.count + 1)));
  end;
  function f(p_edu_level in varchar2) return varchar2 is
  begin
    return
      -- simple case: http://docs.oracle.com/database/121/LNPLS/controlstatements.htm#LNPLS394
      case p_edu_level
        when 'secondary' then r(str_list_t('ICSE', 'CBSE', 'STATE BOARD'))
        when 'intermediate' then r(str_list_t('MPC', 'BIPC', 'MIPC', 'CEC'))
        -- add here your other education levels, you should see the pattern ...
        else null
      end;
  end;
begin
  -- for loop: http://docs.oracle.com/database/121/LNPLS/controlstatements.htm#LNPLS411
  for i in 1 .. 10
  loop
    dbms_output.put_line('secondary: ' || f('secondary'));
    dbms_output.put_line('intermediate: ' || f('intermediate'));
  end loop;
  dbms_output.put_line('batman: ' || f('batman'));
end;
/

双表上没有ICSE列。您可能希望使用“ICSE”而不是ICSE,其他varchar值也是如此。Varchar值必须具有sorrounding,而不是SOR。此外,您还可以对VAL执行即时“查询”。是的,我尝试了另一种方法-使用“ICSE”。但是错误如上所示,为什么所有这些都立即执行?您似乎不需要动态sql,因此请尝试简化代码,避免使用动态sql,但错误显示…-这是另一个错误,您的代码中有太多错误。在你修复一个错误后,你会得到一个不同的错误,这是绝对正常的,事实上它显示了进步。不要指望对一个错误的修复就能修复你所有的错误!好的,谢谢你,凯文。
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 from(SELECT name ' ||
    'FROM  secedu ORDER BY DBMS_RANDOM.RANDOM)where rownum<2'
into vals;
-- blocks: http://docs.oracle.com/database/121/LNPLS/overview.htm#LNPLS141
declare
  -- nested tables: http://docs.oracle.com/database/121/LNPLS/composites.htm#LNPLS99981
  type str_list_t is table of varchar2(32767);
  -- subprograms: http://docs.oracle.com/database/121/LNPLS/subprograms.htm#LNPLS008
  -- common parts of f() refactored to r()
  function r(p_list in str_list_t) return varchar2 is
  begin
    return p_list(floor(dbms_random.value(1, p_list.count + 1)));
  end;
  function f(p_edu_level in varchar2) return varchar2 is
  begin
    return
      -- simple case: http://docs.oracle.com/database/121/LNPLS/controlstatements.htm#LNPLS394
      case p_edu_level
        when 'secondary' then r(str_list_t('ICSE', 'CBSE', 'STATE BOARD'))
        when 'intermediate' then r(str_list_t('MPC', 'BIPC', 'MIPC', 'CEC'))
        -- add here your other education levels, you should see the pattern ...
        else null
      end;
  end;
begin
  -- for loop: http://docs.oracle.com/database/121/LNPLS/controlstatements.htm#LNPLS411
  for i in 1 .. 10
  loop
    dbms_output.put_line('secondary: ' || f('secondary'));
    dbms_output.put_line('intermediate: ' || f('intermediate'));
  end loop;
  dbms_output.put_line('batman: ' || f('batman'));
end;
/