我有一個用兩個欄位定義的記錄型別。
TYPE record is RECORD (
a NUMBER,
b VARCHAR2(20)
);
我定義了一個型別,它是上面提到的記錄型別的表。
TYPE recordTable is TABLE of record;
我在腳本中宣告了一個變數
recordVar recordTable;
在 plsql 腳本中,我成功地recordVar用一些值填充了上面宣告的變數。
發布此我想加入recordVar現有表之一。
我如何實作這一目標?
如果我做一個select * from recordVar. 我收到一條錯誤訊息,指出表或視圖不存在。
uj5u.com熱心網友回復:
不能,aRECORD是 PL/SQL 資料型別,不能在 SQL 陳述句中使用。
DECLARE
TYPE recordType is RECORD ( a NUMBER, b VARCHAR2(20) );
TYPE recordTable is TABLE of recordType;
v_recs recordTable;
BEGIN
v_recs.EXTEND(2);
v_recs(1).a := 23;
v_recs(1).b := 'ABC';
v_recs(2).a := 42;
v_recs(2).b := 'DEF';
FOR i IN (SELECT * FROM TABLE(v_recs))
LOOP
DBMS_OUTPUT.PUT_LINE(i.a || ', ' || i.b);
END LOOP;
END;
/
輸出錯誤:
ORA-06550: line 13, column 33: PLS-00642: local collection types not allowed in SQL statements ORA-06550: line 13, column 27: PL/SQL: ORA-22905: cannot access rows from a non-nested table item ORA-06550: line 13, column 13: PL/SQL: SQL Statement ignored
如果你想做類似的事情,那么OBJECT在 SQL 范圍內將它宣告為 an :
CREATE TYPE objectType is OBJECT( a NUMBER, b VARCHAR2(20) );
CREATE TYPE objectTable is TABLE of objectType;
然后您可以通過表集合運算式在 PL/SQL 和 SQL 中使用它:
DECLARE
v_objs objectTable := objectTable();
BEGIN
v_objs.EXTEND(2);
v_objs(1) := objectType(23, 'ABC');
v_objs(2) := objectType(42, 'DEF');
FOR i IN (SELECT * FROM TABLE(v_objs))
LOOP
DBMS_OUTPUT.PUT_LINE(i.a || ', ' || i.b);
END LOOP;
END;
/
哪些輸出:
23, ABC 42, DEF
然后,如果您想將其與另一個表連接,您可以執行以下操作:
CREATE TABLE table_name (id, value) AS
SELECT 23, 'UVW' FROM DUAL UNION ALL
SELECT 42, 'XYZ' FROM DUAL;
DECLARE
v_objs objectTable := objectTable();
BEGIN
v_objs.EXTEND(2);
v_objs(1) := objectType(23, 'ABC');
v_objs(2) := objectType(42, 'DEF');
FOR i IN (SELECT o.a, o.b, t.value
FROM TABLE(v_objs) o
INNER JOIN table_name t
ON o.a = t.id)
LOOP
DBMS_OUTPUT.PUT_LINE(i.a || ', ' || i.b || ', ' || i.value);
END LOOP;
END;
/
輸出:
23, ABC, UVW 42, DEF, XYZ
db<>在這里擺弄
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/327532.html
