我剛做的,參考下:

成都創(chuàng)新互聯(lián)成立于2013年,我們提供高端重慶網(wǎng)站建設(shè)公司、成都網(wǎng)站制作公司、成都網(wǎng)站設(shè)計(jì)公司、網(wǎng)站定制、成都營(yíng)銷(xiāo)網(wǎng)站建設(shè)、微信小程序開(kāi)發(fā)、微信公眾號(hào)開(kāi)發(fā)、成都網(wǎng)站營(yíng)銷(xiāo)服務(wù),提供專(zhuān)業(yè)營(yíng)銷(xiāo)思路、內(nèi)容策劃、視覺(jué)設(shè)計(jì)、程序開(kāi)發(fā)來(lái)完成項(xiàng)目落地,為橡塑保溫企業(yè)提供源源不斷的流量和訂單咨詢(xún)。
SQL CREATE GLOBAL TEMPORARY TABLE REPROTTEST(
2 ID NUMBER,
3 ANAME VARCHAR2(20)
4 ) ON COMMIT DELETE ROWS;(也可以用PRESERVER ROWS,看實(shí)際需求)
Table created
SQL create or replace procedure report_month_responsibility(
2 o_cur out sys_refcursor)
3 as
4 begin
5 insert into reprottest(id,aname) values(1,'1');
6 open o_cur for select * from reprottest;
7 end report_month_responsibility;
8 /
Procedure created
SQL set serverout on
SQL declare
2 v_id number;
3 v_aname varchar2(20);
4 o_cur sys_refcursor;
5 begin
6 report_month_responsibility(o_cur);
7 fetch o_cur into v_id,v_aname;
8 while o_cur%found loop
9 dbms_output.put_line('輸出結(jié)果:'||v_id||','||v_aname);
10 fetch o_cur into v_id,v_aname;
11 end loop;
12 commit;
13 end;
14 /
輸出結(jié)果:1,1
PL/SQL procedure successfully completed
你的那個(gè)ORA-01031: insufficient privileges,是權(quán)限不足的問(wèn)題。
SQL代碼:
CREATE GLOBAL TEMPORARY TABLE REPROTTEST(
ID NUMBER,
ANAME VARCHAR2(20)
) ON COMMIT DELETE ROWS;
create or replace procedure report_month_responsibility(
o_cur out sys_refcursor)
as
begin
insert into reprottest(id,aname) values(1,'1');
open o_cur for select * from reprottest;
end report_month_responsibility;
declare
v_id number;
v_aname varchar2(20);
o_cur sys_refcursor;
begin
report_month_responsibility(o_cur);
fetch o_cur into v_id,v_aname;
while o_cur%found loop
dbms_output.put_line('輸出結(jié)果:'||v_id||','||v_aname);
fetch o_cur into v_id,v_aname;
end loop;
commit;
end;
/
Oracle?需要通過(guò)?返回一個(gè)游標(biāo)來(lái)處理。
--?測(cè)試表數(shù)據(jù)。
select?*?from?test_main;
ID?VALUE
----------?--------------------
1?ONE
3?THREE
2?TWO
--?返回結(jié)果集的函數(shù).
CREATE?OR?REPLACE?FUNCTION?Get_Test_Main_All
RETURN?SYS_REFCURSOR
IS
return_cursor?SYS_REFCURSOR;
BEGIN
OPEN?return_cursor?FOR?'SELECT?*?FROM?test_main';
RETURN?return_cursor;
END;
/
--?普通的查詢(xún),來(lái)查看結(jié)果.
SELECT?Get_Test_Main_All()?FROM?dual;
GET_TEST_MAIN_ALL()
--------------------
CURSOR?STATEMENT?:?1
CURSOR?STATEMENT?:?1
ID?VALUE
----------?--------------------
1?ONE
3?THREE
2?TWO
--?存儲(chǔ)過(guò)程調(diào)用,?來(lái)獲取結(jié)果.
DECLARE?
--?調(diào)用函數(shù)的返回值.
testCursor?SYS_REFCURSOR;
--?存儲(chǔ)單行數(shù)據(jù).
testRec??test_main%ROWTYPE;
BEGIN
--?調(diào)用返回結(jié)果集的函數(shù).
testCursor?:=?Get_Test_Main_All();
--?循環(huán),遍歷結(jié)果.
LOOP
--?游標(biāo)向前.
FETCH?testCursor?INTO?testRec;
--?無(wú)數(shù)據(jù)的情況下,退出循環(huán).
EXIT?WHEN?testCursor%NOTFOUND;
--?輸出調(diào)試信息.
dbms_output.put_line(?TO_CHAR(testRec.id)?||?'?'?||?testRec.value);
END?LOOP;
END;
/
1?ONE
3?THREE
2?TWO
PL/SQL?過(guò)程已成功完成。
--------------------------------------------------------------------------------
上面的是使用動(dòng)態(tài)SQL處理的。
下面是正常SQL處理的。
CREATE?OR?REPLACE?FUNCTION?Get_Test_Main?
RETURN?SYS_REFCURSOR
IS
return_cursor?SYS_REFCURSOR;
BEGIN
OPEN?return_cursor?FOR?SELECT?*?FROM?test_main;
RETURN?return_cursor;
END;
/
SQL?SELECT?Get_Test_Main()?FROM?dual;
GET_TEST_MAIN()
--------------------
CURSOR?STATEMENT?:?1
CURSOR?STATEMENT?:?1
ID?VALUE
----------?--------------------
2?TWO
--------------------------------------------------------------------------------
上面的是沒(méi)有參數(shù)的
下面是有參數(shù)的
CREATE?OR?REPLACE?FUNCTION?Get_Test_Main?(
p_id??INT
)
RETURN?SYS_REFCURSOR
IS
return_cursor?SYS_REFCURSOR;
BEGIN
OPEN?return_cursor?FOR?SELECT?*?FROM?test_main?WHERE?id?=?p_id;
RETURN?return_cursor;
END;
/
SQL?SELECT?Get_Test_Main(2)?FROM?dual;
GET_TEST_MAIN(2)
--------------------
CURSOR?STATEMENT?:?1
CURSOR?STATEMENT?:?1
ID?VALUE
----------?--------------------
2?TWO
返回游標(biāo)的函數(shù),不是?“表值函數(shù)”
SQL?SELECT?*?FROM?Get_Test_Main(2);
SELECT?*?FROM?Get_Test_Main(2)
*
ERROR?位于第?1?行:
ORA-00933:?SQL?命令未正確結(jié)束
返回cursor的話,那么必須要cursor的手段來(lái)處理,不能作為查詢(xún)語(yǔ)句的目的表。
如果需要在函數(shù)返回一個(gè)可以供查詢(xún)語(yǔ)句使用的結(jié)果集,那么該函數(shù)的返回類(lèi)型應(yīng)該定義為一個(gè)索引表類(lèi)型(一個(gè)table類(lèi)型),然后在查詢(xún)語(yǔ)句中使用table函數(shù)將函數(shù)返回的索引表轉(zhuǎn)換成查詢(xún)可以使用的目的表。示例如下:
1. 創(chuàng)建返回索引表所需的類(lèi)型
create?or?replace?type?type_rec?is?object?(idx?integer,?user_name?varchar2(50));
create?or?replace?type?type_tb?is?table?of?type_rec;
2. 創(chuàng)建函數(shù)
create?or?replace?function?fn_return_tb
return?type_tb
is
o_tb?type_tb?:=?type_tb();
i?number?:=?0;
begin
for?v_rec?in?(select?1?as?idx,?'Andy'?as?user_name?from?dual
union?select?2,?'Jack'?from?dual
union?select?3,?'Paul'?from?dual)?loop
o_tb.extend;
i?:=?i?+?1;
o_tb(i)?:=?type_rec?(v_rec.idx,?v_rec.user_name);
end?loop;
return?o_tb;
end?fn_return_tb;
3. 調(diào)用函數(shù)
select?s.*?
from?table(fn_return_tb())?s;
執(zhí)行結(jié)果如下圖,
oracle的function是不能執(zhí)行ddl的 就是類(lèi)似創(chuàng)建表這種不用commit的操作
返回表名 比如你傳入一個(gè)表名 就返回它 可以建一個(gè)function 但只是學(xué)習(xí) 沒(méi)什么意義
create or replace function testFunction(table_name in varchar2)
return varchar2 is
begin
return table_name;
end;
-- 定義類(lèi)型
CREATE OR REPLACE TYPE MyTable AS OBJECT(A int, B int, C int);
/
CREATE OR REPLACE TYPE MyTableResult IS TABLE OF MyTable;
/
CREATE OR REPLACE FUNCTION getTestTable return MyTableResult
IS
-- 預(yù)期返回結(jié)果.
return_Result? MyTableResult := MyTableResult();
BEGIN
-- 結(jié)果追加一行.
return_Result.EXTEND;
-- 設(shè)置結(jié)果內(nèi)容.
return_Result(return_Result.COUNT) := MyTable(A?? = 1, B=2, C=3);
-- 結(jié)果追加一行.
return_Result.EXTEND;
-- 設(shè)置結(jié)果內(nèi)容.
return_Result(return_Result.COUNT) := MyTable(A?? = 4, B=5, C=6);
-- 結(jié)果追加一行.
return_Result.EXTEND;
-- 設(shè)置結(jié)果內(nèi)容.
return_Result(return_Result.COUNT) := MyTable(A?? = 7, B=8, C=9);
return return_Result;
END getTestTable;
/
SQL SELECT
2??? A, B, C
3? FROM
4?? table( getTestTable() );
A????????? B????????? C
---------- ---------- ----------
1????????? 2????????? 3
4????????? 5????????? 6
7????????? 8????????? 9
SQL?
作為結(jié)果返回,這正是引用游標(biāo)SYS_REFCURSOR或者類(lèi)型TABLE TYPE來(lái)實(shí)現(xiàn)的功能。
網(wǎng)站標(biāo)題:oracle返回表怎么寫(xiě),oracle 函數(shù)返回值 列表
當(dāng)前URL:http://chinadenli.net/article13/dsedjgs.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、服務(wù)器托管、網(wǎng)站設(shè)計(jì)、動(dòng)態(tài)網(wǎng)站、品牌網(wǎng)站建設(shè)、網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)