避免在 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代码封装在机灵的包中

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”问题的解决(代码

Oracle Database 19c 技术架构