【问题标题】:How to reference dynamic variables using LOOP in Oracle如何在 Oracle 中使用 LOOP 引用动态变量
【发布时间】:2020-08-20 18:47:54
【问题描述】:
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 个。 显然这段代码不起作用。我该怎么做?

【问题讨论】:

标签: sql oracle plsql


【解决方案1】:
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。请原谅我可能的错别字。在我的手机上输入。

【讨论】:

  • 谢谢萨扬。为了示例的目的,我引用的 ID_1 和 ID_2 是硬编码的。我将把这些作为系统自动生成的。那么我如何为此制作 v_ID 呢?因此,如果用户选择 3,那么我将自动生成 3 个 ID,我将在下面的查询中传递这些 ID。在这种情况下我该怎么做?
【解决方案2】:

动态事物需要动态 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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-19
    • 2020-01-16
    • 2015-04-14
    • 2021-05-18
    • 2018-05-07
    • 1970-01-01
    相关资源
    最近更新 更多