0

我预计在以下代码变量中xy引用相同的嵌套表对象,但表达式y = x似乎在y. 所以输出令人惊讶的是'No:a c'(但我期望'Yes:ab c')。我应该在 PL/SQL 中做什么才能y将相同的嵌套表对象引用为x.

declare
  type str_t is table of varchar(100);
  x str_t := str_t ();
  y str_t ;
begin 

  x.extend;  x(x.last) := 'a';

  y := x;

  y.extend;  y(y.last) := 'b';

  x.extend;  x(x.last) := 'c';

  dbms_output.put_line(case when x=y then 'Yes: ' else 'No: ' end);

  for i in x.first .. x.last
  loop       
     dbms_output.put_line(x(i));      
  end loop;

Сan它(通过引用传递嵌套表 - 不是通过值)用PL / SQL编写还是根本不可能?语言中是否存在任何替代方案来避免该问题?

4

2 回答 2

1

PL/SQL 没有引用(但在一个地方我们稍后会看到),所以基本上你所要求的在 PL/SQL 中是不可能的。不过,我不明白这怎么会是个问题。

在您的示例中x,并且y是具有相同类型的两个不同变量(嵌套表集合),x := y是变量分配(深拷贝),x = y比较。另见例如为变量赋值

我猜你有一些其他语言的编程背景,你正试图在这里应用一些其他语言范例。您也可能有XY 问题

一种替代方法是使用两个不同的索引变量来访问集合。这可能适合也可能不适合您的情况:

declare
  type str_list_t is table of varchar2(32767);
  v_foos constant str_list_t := str_list_t('a', 'b', 'c');
  -- have some business logic to get the right indices
  i pls_integer := 1;
  j pls_integer := 3;
begin
  dbms_output.put_line(v_foos(i));
  dbms_output.put_line(v_foos(j));
end;
/

但请注意,对集合的更改将使索引变量无效(这就是我声明常量集合的原因)。

使用嵌套表时,还要检查提供强大操作的SQL 多集条件。

唯一具有引用语义的地方是子程序参数,其中不同的参数模式(INOUTIN OUT具有不同的语义(按值传递或按引用传递)。但即使在那里,决定也是由 PL/SQL 编译器/运行时做出的——程序员没有太多的控制权。

于 2015-03-13T12:21:10.920 回答
0

所以输出令人惊讶的是'No:a c'(但我期望'Yes:ab c')。

你的期望是错误的。由于两个数组具有不同的值。

让我们一步一步看:

x.扩展;
x(x.last) := 'a';

因此,x的值为a

y := x;

x被复制到y,因此y具有值a

y.扩展;
y(y.last) := 'b';

现在,yab

x.扩展;
x(x.last) := 'c';

现在,xac

最后,

X --> a,c
Y --> a,b

让我们看看您的代码显示的输出:

SQL> set serveroutput on
SQL> DECLARE
  2  type str_t
  3  IS
  4    TABLE OF VARCHAR(100);
  5    x str_t := str_t ();
  6    y str_t ;
  7  BEGIN
  8    x.extend;
  9    x(x.last) := 'a';
 10    y         := x;
 11    y.extend;
 12    y(y.last) := 'b';
 13    x.extend;
 14    x(x.LAST) := 'c';
 15    FOR i IN x.first .. x.last
 16    LOOP
 17      dbms_output.put_line('X'||'-'||x(i));
 18    END LOOP;
 19    FOR i IN y.first .. y.last
 20    LOOP
 21      dbms_output.put_line('Y'||'-'||y(i));
 22    END LOOP;
 23  END;
 24  /
X-a
X-c
Y-a
Y-b

PL/SQL procedure successfully completed.

SQL>

因此,XY不相等。

为了使它们相等,设置Y = X

SQL> set serveroutput on
SQL> DECLARE
  2  type str_t
  3  IS
  4    TABLE OF VARCHAR(100);
  5    x str_t := str_t ();
  6    y str_t ;
  7  BEGIN
  8    x.extend;
  9    x(x.LAST) := 'a';
 10    x.extend;
 11    x(x.last) := 'b';
 12    x.extend;
 13    x(x.LAST) := 'c';
 14    y         := x;
 15    dbms_output.put_line(case when x=y then 'Yes: ' else 'No: ' end);
 16    FOR i IN x.first .. x.last
 17    LOOP
 18      dbms_output.put_line('X'||'-'||x(i));
 19    END LOOP;
 20  END;
 21  /
Yes:
X-a
X-b
X-c

PL/SQL procedure successfully completed.

SQL>
于 2015-03-13T06:34:36.130 回答