问题描述
clear screen;
set serveroutput on;
DECLARE
ID_1 number;
ID_2 number;
filter1 varchar2(100);
filter2 varchar2(100);
BEGIN
ID_1 := 100;
ID_2 := 101;
FOR i in 1..2
LOOP
IF ID_(i) is not null THEN
SELECT STATE INTO filter(i)
FROM dashboard
WHERE id=ID_(i);
END IF;
dbms_output.put_line(filter(i));
END LOOP;
END;
我想动态创建值,然后在循环中使用“ i”打印变量。在此示例中,我仅采用2个值,但我总共最多可以获取10个值。 显然,此代码不起作用。我该怎么办?
解决方法
DECLARE
type t_ids is table of dashboard.id%type index by pls_integer;
type t_filters is table of dashboard.state%type index by pls_integer;
v_IDs t_ids;
v_filters t_filters;
BEGIN
V_IDs(1):= 100;
V_IDs(2):= 101;
FOR i in 1..2
LOOP
IF v_ids(i) is not null THEN
SELECT d.STATE INTO v_filters(i)
FROM dashboard d
WHERE d.id=v_ids(i);
END IF;
dbms_output.put_line(v_filters(i));
END LOOP;
END;
PS。打扰一下,打扰一下。在我的手机上输入。
,动态事物需要动态SQL。 一切在这里都应该是“动态的”(如果我正确理解了您的要求)。
这是一个基于Scott的DEPT
表的示例;我将获取部门10(id_1
)和部门20(id_2
)的部门名称。
SQL> select * from dept order by deptno;
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK --> this
20 RESEARCH DALLAS --> and this
30 SALES CHICAGO
40 OPERATIONS BOSTON
SQL> set serveroutput on
SQL> begin
2 for i in 1 .. 2 loop
3 execute immediate
4 'declare ' ||
5 ' id_1 number := 10; ' ||
6 ' id_2 number := 20; ' ||
7 ' filter1 varchar2(10); ' ||
8 ' filter2 varchar2(10); ' ||
9 'begin' ||
10 ' select dname into filter' || i ||
11 ' from dept ' ||
12 ' where deptno = id_' || i ||';' ||
13 ' dbms_output.put_line(filter' || i ||');' ||
14 'end;';
15 end loop;
16 end;
17 /
ACCOUNTING --> here they
RESEARCH --> are
PL/SQL procedure successfully completed.
SQL>