如何解决在过程中重用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
,
您尚未发布足够的详细信息,因此,我将尝试列出所有变体:
-
如果只需要几个变量,则可以使用以下选项:
- 替代变量(&var)
- PL / SQL变量,可用的范围不同,例如局部变量,私有或公共程序包变量,甚至对象
- 集合:嵌套表或varray,例如:
- varray:
select * from table(sys.odcivarchar2list('a','b','c'));
- 嵌套表:
select * from table(sys.ku$_vcnt('a','c'));
- 嵌套的数对表:
- varray:
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
- 如果您需要存储数据集(行集):
- 全局临时表(甚至私有临时表(18c +))
- 收藏
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。