gpt4 book ai didi

Oracle - 在使用多个值时的 CLAUSE 问题中,使其动态化

转载 作者:行者123 更新时间:2023-11-30 23:54:57 24 4
gpt4 key购买 nike

我刚刚在 google 上花了一个小时,在这里试图直接回答如何在 Oracle 中执行此操作。我需要的是在自动构造的子句中使用 select 的能力,例如

select col1 from table1 where id.table IN ('1','2','3');

其中 id 值被传递给数组内的存储过程。关联数组定义如下:
 TYPE varchar_array_type IS TABLE OF VARCHAR2 (40)      INDEX BY BINARY_INTEGER;

有没有简单、具体的方法来做到这一点?谢谢

最佳答案

不幸的是,如果您的集合类型是在 PL/SQL(而不是 SQL)中定义的,则不能在 SQL 中使用它,因为 SQL 引擎不知道如何处理它。

如果相反,您在 SQL 中定义了集合类型,即

CREATE TYPE varchar_tbl
IS TABLE OF varchar2(40);

然后你可以做类似的事情
SELECT col1
FROM table1 t1
WHERE t1.id IN (SELECT column_value
FROM TABLE( <<variable of type varchar2_tbl>> ) )

取决于 Oracle 版本——在 SQL 中使用集合的语法随着时间的推移而发展——旧版本的 Oracle 有更复杂的语法。

您可以将 PL/SQL 关联数组(您的 VARCHAR_ARRAY_TYPE)转换为 PL/SQL 中的 SQL 嵌套表集合,但这需要遍历关联数组并填充嵌套表,这有点麻烦。假设 VARCHAR_TBL嵌套表集合已经创建
SQL> CREATE OR REPLACE TYPE varchar_tbl
IS TABLE OF varchar2(40);

您可以从关联数组转换为嵌套表,并在这样的 SQL 语句中使用嵌套表(使用 SCOTT.EMP 表)
declare
type varchar_array_type
is table of varchar2(40)
index by binary_integer;
l_associative_array varchar_array_type;
l_index binary_integer;
l_nested_table varchar_tbl := new varchar_tbl();
l_cnt pls_integer;
begin
l_associative_array( 1 ) := 'FORD';
l_associative_array( 10 ) := 'JONES';
l_associative_array( 100 ) := 'NOT A NAME';
l_associative_array( 75 ) := 'SCOTT';
l_index := l_associative_array.FIRST;
while( l_index IS NOT NULL )
loop
l_nested_table.EXTEND;
l_nested_table( l_nested_table.LAST ) :=
l_associative_array( l_index );
l_index := l_associative_array.NEXT( l_index );
end loop;
SELECT COUNT(*)
INTO l_cnt
FROM emp
WHERE ename IN (SELECT column_value
FROM TABLE( l_nested_table ) );
dbms_output.put_line( 'There are ' || l_cnt || ' employees with a matching name' );
end;

但是,因为在集合类型之间转换有点麻烦,除非有特殊原因需要关联数组,否则您通常最好只使用嵌套表集合(并将其传递给存储过程)。

关于Oracle - 在使用多个值时的 CLAUSE 问题中,使其动态化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4455878/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com