像这样:
CREATE OR REPLACE type P_REC AS OBJECT
(
ATTR1 VARCHAR2(64 BYTE),
ATTR2 VARCHAR2(128 BYTE),
ATTR3 VARCHAR2(128 BYTE),
ATTR4 VARCHAR2(128 BYTE)
);
CREATE OR REPLACE type P_REC_LIST is table of P_REC;
DECLARE
tmpPList P_REC_LIST := P_REC_LIST(P_REC('A1','A2','A3','A4'),
P_REC('B1','B2','B3','B4'),
P_REC('C1','C2','C3','C4')
);
BEGIN
testProc(tmpPList);
END;
那么我可以写:
select * from TABLE(tmpPList)
但问题是我不想在数据库中创建任何类型,因为数据库是禁止更改模式的。
我想这样写:
select * from ( ( ('att1','att2','att3','att4'),('att1a','att2a','att3a','att4a') ) ) t
,但在语法中是不允许的。
是否有任何方法可以在飞行中选择表?
最终目标与本文相同:合并和删除但问题是我不能在oracle中创建类型
在标准SQL中,您将使用VALUES
行构造函数。
select * from (values ('att1'), ('att2'), ('att3'), ('att4')) t(attr)
但是Oracle仍然不支持
您可以选择单个值(在Oracle中必须从DUAL
中选择),然后使用UNION ALL
获得整个数据集:
select 'att1' as attr from dual
union all
select 'att2' as attr from dual
union all
select 'att3' as attr from dual
union all
select 'att4' as attr from dual;
对于更多列,选择更多列:-)
select 'att11' as attr1, 'att12' as attr2, 'att13' as attr3 from dual
union all
select 'att21' as attr1, 'att22' as attr2, 'att23' as attr3 from dual
虽然Oracle还不支持标准sql的VALUES
行构造函数,但您可以使用内部odcivarchar2list
来实现此目的。
SQL> select * from table(sys.odcivarchar2list('value1','value2','value3')) ;
COLUMN_VALUE
--------------------------------------------------------------------------------
value1
value2
value3
如果你的值是数字,那么你可以使用odcinumberlist
SQL> select * from table(sys.odcinumberlist(1,2,3,4,5,6)) ;
COLUMN_VALUE
------------
1
2
3
4
5
6
6 rows selected.