代码之家  ›  专栏  ›  技术社区  ›  Niels Van Steen

Oracle PL SQL函数没有INTO子句,但它实际上有一个SELECT INTO

  •  0
  • Niels Van Steen  · 技术社区  · 2 年前

    我在一个包里有一个函数。

    身体:

    CREATE OR REPLACE PACKAGE BODY pkg_developers AS
    
         FUNCTION lookup_developer_studio(p_studio_name IN DEVELOPERSTUDIOS.STUDIONAME%type)
                RETURN INTEGER
            IS
                f_developerstudioid INTEGER;
            BEGIN
                SELECT developerstudioid INTO f_developerstudioid
                FROM developerStudios
                WHERE studioName = p_studio_name;
                RETURN (f_developerstudioid);
            END lookup_developer_studio;
    END pkg_developers;
    

    标题:

    CREATE OR REPLACE PACKAGE pkg_developers
    AS
    
        FUNCTION lookup_developer_studio(p_studio_name IN DEVELOPERSTUDIOS.STUDIONAME%type) RETURN INTEGER;
    END pkg_developers;
    

    我正在这样测试函数:

    BEGIN
        select pkg_developers.lookup_developer_studio('some name') from dual;
    END;
    

    我得到的错误是:

    [2022-04-16 13:06:06] [65000][6550]
    [2022-04-16 13:06:06]   ORA-06550: line 6, column 5:
    [2022-04-16 13:06:06]   PLS-00428: an INTO clause is expected in this SELECT statement
    [2022-04-16 13:06:06] Summary: 1 of 1 statements executed, 1 failed in 15 ms (285 symbols in file)
    

    但据我所知,我确实有一个INTO条款?

    当我以静态方式运行查询时,如: SELECT developerstudioid FROM developerStudios WHERE studioName = 'some name'; 我得到的结果是一个整数。

    1 回复  |  直到 2 年前
        1
  •  1
  •   Littlefoot    2 年前

    你以前的代码 测验 它不等于你最初发布的内容——这实际上是一个错误 PL/SQL 块,然后需要 INTO 条款:

    SQL> BEGIN
      2      select pkg_developers.lookup_developer_studio('some name') from dual;
      3  END;
      4  /
        select pkg_developers.lookup_developer_studio('some name') from dual;
        *
    ERROR at line 2:
    ORA-06550: line 2, column 5:
    PLS-00428: an INTO clause is expected in this SELECT statement
    

    要是 SELECT (在SQL级别)那么是的-您不需要 进入 :

    SQL> select * from developerstudios;
    
    STU DEVELOPERSTUDIOID
    --- -----------------
    MGM               100
    
    SQL>     select pkg_developers.lookup_developer_studio('MGM') from dual;
    
    PKG_DEVELOPERS.LOOKUP_DEVELOPER_STUDIO('MGM')
    ---------------------------------------------
                                              100
    
    SQL>
    

    如果需要PL/SQL,则声明一个将存储该值的变量:

    SQL> SET SERVEROUTPUT ON
    SQL>
    SQL> DECLARE
      2    l_id developerstudios.developerstudioid%type;
      3  BEGIN
      4      select pkg_developers.lookup_developer_studio('MGM') INTO l_id from dual;
      5      dbms_output.put_line('Result = ' || l_id);
      6  END;
      7  /
    Result = 100
    
    PL/SQL procedure successfully completed.
    
    SQL>