出于安全目的,我想要一個回傳整個列值的物體。
物體示例:存盤程序、函式、表值函式。
例子:
CREATE OR REPLACE FUNCTION simpleSelect RETURN VARCHAR2 AS
output1 VARCHAR2(100);
BEGIN
Select (col1 ) INTO output1 from SCHEMA1.TABLE1;
RETURN output1;
END
;
上面給出了以下錯誤:
[Error] Execution (17: 9): ORA-01422: exact fetch returns more than requested number of rows
ORA-06512:
創建物體并呼叫物體的語法是什么?
uj5u.com熱心網友回復:
選項 1:在程序中使用游標:
CREATE PROCEDURE simpleSelect
(
o_cursor OUT SYS_REFCURSOR
)
IS
BEGIN
OPEN o_cursor FOR
Select col1 from SCHEMA1.TABLE1;
END;
/
選項 2:使用流水線函式:
CREATE TYPE string_list IS TABLE OF VARCHAR2(100);
CREATE FUNCTION simpleSelect
RETURN string_list PIPELINED
IS
v_cursor SYS_REFCURSOR;
v_value SCHEMA1.TABLE1.COL1%TYPE;
BEGIN
OPEN v_cursor FOR
Select col1 from SCHEMA1.TABLE1;
LOOP
FETCH v_cursor INTO v_value;
EXIT WHEN v_cursor%NOTFOUND;
PIPE ROW (v_value);
END LOOP;
CLOSE v_cursor;
EXCEPTION
WHEN NO_DATA_NEEDED THEN
CLOSE v_cursor;
END;
/
選項 3:使用(非流水線)函式:
CREATE TYPE string_list IS TABLE OF VARCHAR2(100);
CREATE FUNCTION simpleSelect
RETURN string_list
IS
v_values string_list;
BEGIN
SELECT col1
BULK COLLECT INTO v_values
FROM SCHEMA1.TABLE1;
RETURN v_values;
END;
/
注意:雖然這可能很短,但如果有大量的行,那么您將在記憶體中創建一個巨大的資料結構,并可能導致性能問題;使用流水線函式或游標將資料流式傳輸到第三方應用程式可能會更好。
小提琴
uj5u.com熱心網友回復:
這是一個簡單的選擇;看看它是否有幫助。它使用 Oracle 內置型別,可讓您存盤字串;另一個,對于numbers,是sys.odcinumberlist(不知道你的資料型別是什么,col1所以我選擇了其中一個)。益處?您甚至不必創建自己的型別!
SQL> create or replace function simpleselect
2 return sys.odcivarchar2list
3 is
4 retval sys.odcivarchar2list;
5 begin
6 select ename
7 bulk collect into retval
8 from emp;
9 return retval;
10 end;
11 /
Function created.
結果是什么?
SQL> select * from table(simpleselect);
COLUMN_VALUE
--------------------------------------------------------------------------------
SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER
14 rows selected.
SQL>
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/521410.html
上一篇:用Python求解線性方程
