当前位置: 首页 > 面试题库 >

从java中的plsql函数获取返回的记录类型

齐琦
2023-03-14
问题内容

我有一个plsql返回记录类型的函数challan_rec

create or replace package xx_bal_api as
    type challan_rec is record (
        challan_number varchar2(40),
        challan_amount number
    );


    FUNCTION get_challan(foo number) return challan_rec;
end;



create or replace package body xx_bal_api as

    FUNCTION get_challan(foo number) return challan_rec
    is
    cr challan_rec;
    begin
        cr.challan_number := '00002154215'; 
        cr.challan_amount := 2265;
        return cr;
    end get_challan;
end;

我想从Java代码中调用此函数,并在Java中获取该记录类型。请指导我如何做。谢谢


问题答案:

首先让我们从更正您的代码开始。我可以看到您发布的代码无法编译,并且会引发问题。正确的代码如下:

CREATE OR REPLACE PACKAGE xx_bal_api
AS
   TYPE challan_rec IS RECORD
   (
      challan_number   VARCHAR2 (40),
      challan_amount   NUMBER
   );

   TYPE rec IS TABLE OF challan_rec index by pls_integer;

   FUNCTION get_challan (foo NUMBER)
      RETURN rec;
END;
/
CREATE OR REPLACE PACKAGE BODY xx_bal_api
AS
   FUNCTION get_challan (foo NUMBER)
      RETURN rec
   IS
      cr   rec;
   BEGIN
      cr (1).challan_number := '00002154215';
      cr (1).challan_amount := foo;
      RETURN cr;
   END get_challan;
END;

执行此代码时,您可能会遇到类似的问题invalid datatype。这是因为a RECORD仅限在中使用PLSQL

select xx_bal_api.get_challan(2265) from dual;

ORA-00902:无效的数据类型

最好的方法是先创建一个对象的a OBJECT和a TYPE,然后return在您的函数中创建它:

CREATE OR REPLACE TYPE challan_rec IS OBJECT
(
   challan_number VARCHAR2 (40),
   challan_amount NUMBER
);
/    
CREATE OR REPLACE Type rec is table of challan_rec;
/ 
 CREATE OR REPLACE FUNCTION get_challan(foo number) 
    return rec
  is  
    cr rec:=rec();

   begin
        cr.extend();
        cr(1):= challan_rec('00002154215',foo);        
        return cr;
   end get_challan;   
end;

/

执行:

SQL> select get_challan(2265) from dual;
     /


 类似资料:
  • 我知道Postgres允许返回预定义的复合数据类型、记录和具有列定义的表。 然而,我没有返回一个定义了列的简单记录,所以我总是使用表,即使我知道这只返回一行。 我的函数定义如下: 如果我尝试以同样的方式返回记录,则返回失败: 这在博士后中不可能吗?我知道我可以只声明一个自定义复合数据类型,但我不想为每个返回记录的函数声明一个类型。

  • 问题内容: 返回vs的函数有什么区别,其他所有条件相等。 这些函数似乎返回相同的结果。请参阅此SQLFiddle。 问题答案: 返回时,输出列未键入且未命名。因此,这种形式不能像在子查询或表中一样直接在FROM子句中使用。 即,在发行时: 我们得到这个错误: 错误:返回“记录”的函数需要列定义列表 但是,SQL调用者可以将其“广播”为正确的列类型。此表格可以正常工作: 结果为: 因此,被认为不太实

  • 问题内容: 是否可以获取从调用范围返回函数的行号? 例: 我认为这是不可能的,因为它应该已经从堆栈中删除了,但是也许它仍然被缓存在某个地方? 用例是我有一个HTTP处理程序,我想记录返回错误的行和文件名,而不必乱扔代码。 问题答案: AFAIK,不可能自动获取执行最后一次返回的行。 但是,有了一个小帮手,您可以拥有: 操场 输出:

  • 问题内容: 我已经使用过返回一定数量的行。我的代码是这样的: 有没有什么方法可以检查返回的行数?还是我必须自己写? 问题答案: 您可以使用循环而不是循环,以便在执行循环后调用该循环,如下所示: 或自己计算行数:

  • 我在包规格中有记录类型: 和返回此类型的函数。我正在使用MyBatis与Spring的集成。如何调用(使用MyBatis XML映射器)这个函数并将结果映射到POJO对象?

  • 我正在学习如何获取重载函数vs的返回值的。 我修改了SO答案中的代码(由chris编写)。 我有一个编译错误。 错误:“std::result\u of”中没有名为“type”的类型 据我所知:- >