微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在过程中重用Select语句

如何解决在过程中重用Select语句

我喜欢做类似的事情

create tmp_table as ( select 1 some_value,2 some_other_value from dual union select 3 some_value,4 some_other_value from dual );

insert into table1 (field1) select some_value from tmp_table;

update table2 set field2 = 5 where field1 in ( select some_value from tmp_table );

drop tmp_table;

还有更好的方法吗?也许是WITH语句的迭代使用?

with tmp_statement as (select ...) ( insert... update ... )

编辑:

您好,很抱歉出现非常笼统的问题。基本上,我想通过拆分操作但保持“仅选择一个”规则有效来改进某些公司语法(select..loop ...在这里逐行缓慢地执行操作),因为选择将变得很庞大,而您想要只编辑一个选择。我尝试使用with,因为它似乎更接近现有语法。但是也许将选择加载到临时/私有/实际表中的功能只是执行此操作的更好方法

谢谢大家!

解决方法

如果您正在寻找一个纯SQL解决方案来跨多个语句引用一个值,请使用替换变量(在SQL * Plus,SQL Developer,sqlcl和任何其他支持SQL * Plus命令的环境中有效):

ACCEPT some_value PROMPT "Please enter a value for SOME_VALUE:"

insert into table1 (field1) select '&&some_value' from dual;

update table2 set field2 = 5 where field1 in ('&&some_value' );

但是,使用基于集合的操作表明您期望TMP_TABLE可以容纳多于一行。上面的方法在这种情况下不起作用。在这种情况下,请编辑您的问题以提供有关您要达到的目标的更多详细信息。

对此有多种解决方案,包括PL / SQL集合或跨执行保留TMP_TABLE。这取决于您要执行此操作的频率。

创建和删除TMP_TABLE之类的对象的反模式在具有T-SQL背景的开发人员中很常见。 Oracle在几个方面与SQL Server有所不同,这是其中之一:作为某些事务逻辑的一部分,它不愿动态执行DDL。

您可能需要的方法是将TMP_TABLE创建为GLOBAL TEMPORARY TABLE。这是一个永久数据结构,但在交易(或会话)结束时会丢弃其数据。如果选择此方法,则只需创建一次TMP_TABLE,然后在需要时使用它,而不必在每个会话结束时删除。 Find out more.

,

如果您使用的是Oracle 18c或更高版本,则可以使用新的private temporary tables

在您的特定情况下,您可以创建私有表,然后进行插入以及更新,提交和退出。私有临时表可以是事务特定的或会话特定的。

请考虑参数PRIVATE_TEMP_TABLE_PREFIX的值,该参数确定名称约定的前缀

create private temporary table ora$ptt_tmp_table on commit drop definition 
as select 1 as some_value from dual  ;          

insert into table1 (field1) select some_value from ora$ptt_tmp_table  ;

update table2 set field2 = 5 where field1 in ( select some_value from  ora$ptt_tmp_table  );

commit ; -- here the private table is dropped automatically
,

您尚未发布足够的详细信息,因此,我将尝试列出所有变体:

  1. 如果只需要几个变量,则可以使用以下选项:

    • 替代变量(&var)
    • PL / SQL变量,可用的范围不同,例如局部变量,私有或公共程序包变量,甚至对象
    • 集合:嵌套表或varray,例如:
      • varray:select * from table(sys.odcivarchar2list('a','b','c'));
      • 嵌套表:select * from table(sys.ku$_vcnt('a','c'));
      • 嵌套的数对表:
select * 
from
 table(
   sys.ku$_objnumpairlist(
         ku$_objnumpair(1,2),ku$_objnumpair(3,4)));
      NUM1       NUM2
---------- ----------
         1          2
         3          4
  • 上下文变量,例如:
SQL> call DBMS_SESSION.SET_CONTEXT('CLIENTCONTEXT','var1','value1');

Call completed.

SQL> select SYS_CONTEXT('CLIENTCONTEXT','var1') as var1 from dual;

VAR1
-----------------
value1
  1. 如果您需要存储数据集(行集):
  • 全局临时表(甚至私有临时表(18c +))
  • 收藏

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。