PL/SQL 使用 table 变量作为查询 table
PL/SQL Use table variable as query table
在PL/SQL中是否可以使用变量作为查询a table?
尝试过:
declare
TYPE t_name IS TABLE OF varchar(50) INDEX BY PLS_INTEGER;
v_names t_name;
begin
select name bulk collect into v_names from my_table;
select name from v_names where name = 'Max';
end;
是的...但不是您的做法,原因有二:
- 首先,你没有集合(你称之为 table 变量),因为你已经使用
INDEX BY PLS_INTEGER
所以你有一个关联数组。
- 其次,您只能在 SQL 查询中使用集合,其中数据类型已在 SQL 范围内声明(而您的数据类型在 PL/SQL 中声明)。
因此,首先您需要创建类型:
CREATE TYPE t_name IS TABLE OF VARCHAR2(50);
然后你可以 运行 PL/SQL 块:
DECLARE
v_names t_name;
v_name VARCHAR2(50);
BEGIN
SELECT name
BULK COLLECT INTO v_names
FROM my_table;
SELECT COLUMN_VALUE
INTO v_name
FROM TABLE(v_names)
WHERE COLUMN_VALUE = 'Max';
DBMS_OUTPUT.PUT_LINE( v_name );
END;
/
(注意:第二个查询中的 table 集合表达式具有伪列 COLUMN_VALUE
而不是来自 table 的任何特定标识符。)
db<>fiddle here
在PL/SQL中是否可以使用变量作为查询a table?
尝试过:
declare
TYPE t_name IS TABLE OF varchar(50) INDEX BY PLS_INTEGER;
v_names t_name;
begin
select name bulk collect into v_names from my_table;
select name from v_names where name = 'Max';
end;
是的...但不是您的做法,原因有二:
- 首先,你没有集合(你称之为 table 变量),因为你已经使用
INDEX BY PLS_INTEGER
所以你有一个关联数组。 - 其次,您只能在 SQL 查询中使用集合,其中数据类型已在 SQL 范围内声明(而您的数据类型在 PL/SQL 中声明)。
因此,首先您需要创建类型:
CREATE TYPE t_name IS TABLE OF VARCHAR2(50);
然后你可以 运行 PL/SQL 块:
DECLARE
v_names t_name;
v_name VARCHAR2(50);
BEGIN
SELECT name
BULK COLLECT INTO v_names
FROM my_table;
SELECT COLUMN_VALUE
INTO v_name
FROM TABLE(v_names)
WHERE COLUMN_VALUE = 'Max';
DBMS_OUTPUT.PUT_LINE( v_name );
END;
/
(注意:第二个查询中的 table 集合表达式具有伪列 COLUMN_VALUE
而不是来自 table 的任何特定标识符。)
db<>fiddle here