Oracle:从记录数据类型中选择

4 oracle

我有一个函数返回记录数据类型(2个字段:ID和名称).如何从select语句中获取数据?

具体来说,我正在尝试使用OracleCommand对象尝试将对象转换为我的C#代码.我最初尝试过......

CALL FUNCTION_NAME() INTO :loRetVal
Run Code Online (Sandbox Code Playgroud)

...但是对于我使用的任何类型,我都会收到数据类型错误.我也试过......

SELECT * FROM FUNCTION_NAME()
Run Code Online (Sandbox Code Playgroud)

......而且......

SELECT * FROM TABLE ( FUNCTION_NAME() )
Run Code Online (Sandbox Code Playgroud)

......无济于事 我想我在寻找......

SELECT * FROM RECORD ( FUNCTION_NAME() )
Run Code Online (Sandbox Code Playgroud)

......当然,这不存在.

我能够想出的唯一解决方案是在另一个函数调用中包装此函数调用,其中外部函数返回包含此唯一记录的记录表.然而,这似乎很麻烦,我正在寻找一种更简单的方法.任何帮助,将不胜感激.

编辑:对不起,我也试过了SELECT FUNCTION_NAME() FROM DUAL.

Rob*_*ijk 6

记录数据类型是PL/SQL数据类型.SQL不知道它.这可能是你收到错误的原因.看这个例子:

SQL> create package mypkg
  2  as
  3    type myrec is record
  4    ( id int
  5    , name varchar2(10)
  6    );
  7    function f return myrec;
  8  end mypkg;
  9  /

Package created.

SQL> create package body mypkg
  2  as
  3    function f return myrec
  4    is
  5      r myrec;
  6    begin
  7      r.id := 1;
  8      r.name := 'test';
  9      return r;
 10    end f;
 11  end mypkg;
 12  /

Package body created.

SQL> desc mypkg
FUNCTION F RETURNS RECORD
   ID                           NUMBER(38)              OUT
   NAME                         VARCHAR2(10)            OUT

SQL> select mypkg.f from dual
  2  /
select mypkg.f from dual
       *
ERROR at line 1:
ORA-00902: invalid datatype
Run Code Online (Sandbox Code Playgroud)

SQL中的错误我指的是.您可以从PL/SQL调用它:

SQL> declare
  2    r mypkg.myrec;
  3  begin
  4    r := mypkg.f;
  5    dbms_output.put_line(r.id);
  6    dbms_output.put_line(r.name);
  7  end;
  8  /
1
test

PL/SQL procedure successfully completed.
Run Code Online (Sandbox Code Playgroud)

如果要在SQL中使用该函数,则可以创建SQL对象类型.请注意,直接从C#调用函数看起来比坚持使用SQL执行此操作更为可取.但只是为了记录:

SQL> drop package mypkg
  2  /

Package dropped.

SQL> create type myobj is object
  2  ( id int
  3  , name varchar2(10)
  4  );
  5  /

Type created.

SQL> create package mypkg
  2  as
  3    function f return myobj;
  4  end mypkg;
  5  /

Package created.

SQL> create package body mypkg
  2  as
  3    function f return myobj
  4    is
  5    begin
  6      return myobj(1,'test');
  7    end f;
  8  end mypkg;
  9  /

Package body created.

SQL> select mypkg.f from dual
  2  /

F(ID, NAME)
--------------------------------------------------------------
MYOBJ(1, 'test')

1 row selected.
Run Code Online (Sandbox Code Playgroud)

问候,Rob.

  • 我真的很喜欢你的回答.继续沿着这条道路前进.您可以创建一个集合并将其强制转换为SQL. - 创建一个集合类型CREATE TYPE myobj_tab AS TABLE OF myobj; - 让函数返回一个集合类型CREATE OR REPLACE函数f return myobj_tab IS objtab myobj_tab; 开始objtab:= myobj_tab(myobj(1,'test')); return objtab; 结束f; - 将它作为一个表格直接从中选择.SELECT id,name FROM TABLE(CAST(f()AS myobj_tab)); (2认同)

Jef*_*emp 0

为什么需要使用 SQL?您也许可以只使用 System.Data.CommandType.StoredProcedure 来调用该函数。

从 C# 调用 Oracle 函数

使用C#调用包中的Oracle函数