避免在 PL/SQL 中从双重联合中选择
Posted
技术标签:
【中文标题】避免在 PL/SQL 中从双重联合中选择【英文标题】:Avoid select from dual Union in PL/SQL 【发布时间】:2020-07-24 14:04:31 【问题描述】:我有这些数据:
'DJORDAN','ADAVIS','MJONES','DPRESTOM','PSMITH'
我需要将数据转换为游标 o 在其他情况下使用 INSERT 然后我做:
Select 'DJORDAN' User_Code from dual
union
Select 'ADAVIS' User_Code from dual
union
Select 'MJONES' User_Code from dual
union
Select 'DPRESTOM' User_Code from dual
union
Select 'PSMITH' User_Code from dual ;
是否有任何替代 Union DUal 用于此目的?
提前致谢!
【问题讨论】:
即使使用这种方法,您也可以使用union all
代替 union
,因为您知道所有值都是不同的。
【参考方案1】:
你可以使用一个集合,例如:
select * from SYS.DBMS_DEBUG_VC2COLL ('DJORDAN','ADAVIS','MJONES','DPRESTOM','PSMITH');
或者对于旧版本的 Oracle:
select * from TABLE(SYS.DBMS_DEBUG_VC2COLL ('DJORDAN','ADAVIS','MJONES','DPRESTOM','PSMITH'));
【讨论】:
它运行了吗?对我来说,我必须这样做“选择 * FROM TABLE(SYS.DBMS_DEBUG_VC2COLL('g','h'));”在甲骨文 19c 中 啊,我现在是 20C,所以更滑!select * from sys.dbms_debug_vc2coll ('A','B','C');
在 19.0.0 中为我工作。
@William Robertson :- 对我来说,我在 PL/SQL Developer 工具 (13.0.6) SQL 窗口中运行它并且遇到了问题(在 ORA-03114 中运行查询结果:未连接到 ORACLE ,看到您的评论后,我尝试使用 SQL * 命令提示符,它工作正常,但我不确定 IDE 出现问题的原因。【参考方案2】:
另一个简单的解决方案:
create table t1 (user_code varchar2 (10))
/
begin
insert into t1 (user_code)
select trim (column_value) user_code
from xmlTable (
replace (q'"'DJORDAN','ADAVIS','MJONES','DPRESTOM','PSMITH'"', '''', '"'));
end;
/
select * from t1;
结果:
USER_CODE
----------
DJORDAN
ADAVIS
MJONES
DPRESTOM
PSMITH
【讨论】:
【参考方案3】:或者,如果输入更多,假设名称列表 - 实际上 - string,您可以将其拆分为行,然后插入到表中。像这样的:
SQL> create table test (col varchar2(20));
Table created.
SQL> insert into test
2 with temp (col) as
3 (select q'['DJORDAN','ADAVIS','MJONES','DPRESTOM','PSMITH']' from dual)
4 select regexp_substr(replace(col, chr(39), null), '[^,]+', 1, level) val
5 from temp
6 connect by level <= regexp_count(col, ',') + 1;
5 rows created.
SQL> select * from test;
COL
--------------------
DJORDAN
ADAVIS
MJONES
DPRESTOM
PSMITH
SQL>
或者,如果您使用 Apex,它的 APEX_STRING.SPLIT
也可以完成这项工作:
select column_value
from apex_string.split('DJORDAN,ADAVIS,MJONES,DPRESTOM,PSMITH', ',');
【讨论】:
以上是关于避免在 PL/SQL 中从双重联合中选择的主要内容,如果未能解决你的问题,请参考以下文章
PL/SQL ORA-01422 SELECT INTO 错误,Oracle 匿名块(NOVA 环境)
在使用 Entity Framework 数据库优先在表上插入行之前,如何从 PL/SQL 执行触发器?
Windows 64位 安装Oracle instantclient 官方绿色版和PL/SQL Developer 总结
PL/SQL developer连接oracle出现“ORA-12154:TNS:could not resolve the connect identifier specified”问题的解决(代码