从未创建的oracle表中选择,并且数据库中没有创建类型



像这样:

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.

最新更新