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.
记录数据类型是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?您也许可以只使用 System.Data.CommandType.StoredProcedure 来调用该函数。