【问题标题】:Writing a select statement inside an Oracle user-defined function在 Oracle 用户定义函数中编写 select 语句
【发布时间】:2011-05-08 01:26:44
【问题描述】:

我对 Oracle SQL 还是很陌生(尽管我已经写了相当多的 SQL)并且在函数中嵌入一个简单的 SELECT 语句时遇到了麻烦。感觉就像 SQL ABC,但我似乎无法理解 :(

认为我正在使用 PL-SQL

这是我目前所拥有的:

create or replace FUNCTION GET_GROUP_BY_ID RETURN VARCHAR2
AS my_result
BEGIN

  SELECT fav_group.name 
    INTO my_result 
    FROM fav_group 
   WHERE fav_group.id = 12345

  RETURN my_result;

END GET_GROUP_BY_ID;

正如我所说,我通过查看 google 上的代码示例对上述代码尝试了很多变体,但似乎无法正确。

【问题讨论】:

    标签: sql oracle function plsql


    【解决方案1】:

    回答我上面对 OMG Ponies 回答的最后评论:

    要从函数返回一个以上的结果,请使用 REF CURSOR

    create or replace
    PACKAGE BODY REPORTING AS
    
       FUNCTION GET_GROUP_BY_GID RETURN REF_CURSOR AS
    
       RESULT_SET REF_CURSOR;
    
        BEGIN
          OPEN RESULT_SET FOR
          SELECT favorite_group.name
          FROM favorite_group
          WHERE favorite_group.creator_gid = 450160;
    
          RETURN RESULT_SET;
    
          EXCEPTION WHEN OTHERS THEN
            RAISE;
    
    
       END GET_GROUP_BY_GID;
    

    【讨论】:

      【解决方案2】:

      用途:

      CREATE OR REPLACE FUNCTION GET_GROUP_BY_ID 
      RETURN VARCHAR2 AS
      
        my_result FAV_GROUP.NAME%TYPE;
      
      BEGIN
      
        SELECT fav_group.name 
          INTO my_result 
          FROM fav_group 
         WHERE fav_group.id = 12345;
      
        RETURN my_result;
      
      END GET_GROUP_BY_ID;
      

      问题是 my_result 被用作变量,但从未声明。

      我使用%TYPE 表示法来声明变量,因此它使用与用于填充它的列相同的数据类型。如果列数据类型发生更改,变量会自动更改以适应 - 更改表后无需担心数据类型问题,除非您完全删除列。

      【讨论】:

      • 感谢您的回答。当我尝试此代码时,我收到以下错误消息: Error(4,1): PLS-00103: Encountered the symbol "DECLARE" when expecting 以下之一:begin function package pragma procedure subtype type use 形成当前光标外部语言符号“开始”被替换为“声明”以继续。
      • 错误(15,3):PLS-00103:在预期以下之一时遇到符号“RETURN”:* & - + ; / at for mod 余数 rem and or group has intersect minus order start union where connect ||多集
      • Error(17,21): PLS-00103: Encountered the symbol "end-of-file" when expecting 以下之一:begin function package pragma procedure subtype type use 形成当前光标
      • @the_new_mr:现在试试 - 我忘记了终止 SELECT 语句的分号。大约 6 分钟前已经删除了 DECLARE 关键字——你应该在复制/粘贴之前刷新页面,以防有人更新他们的答案。
      • @Quassnoi:谢谢——我很少在 END 符号中包含函数名称。忙着确保我是第一个:/
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-19
      • 1970-01-01
      • 2013-09-15
      • 1970-01-01
      • 1970-01-01
      • 2016-03-18
      • 2012-10-18
      相关资源
      最近更新 更多