本机动态 SQL - 使用列名和表名立即执行

nar*_*hex 2 oracle dynamic-sql

我必须进行动态查询,它使用 oracle pl/sql 中的本机动态 sql 动态绑定列名和表名。

这是我的第一次尝试:

declare 
  komenda varchar2(255);
  v1 varchar2(10):='id_osrodek';
  v2 varchar2(10):='nazwa_o';
  v3 varchar2(10):='osrodki';
begin
  komenda := 'select distinct e.id_student, e.przedmiot, e.:1, o.:2 from egzaminy e
    inner join :3 o on o.:4 = e.:5
    inner join przedmioty p on e.id_przedmiot = p.id_przedmiot';
  execute immediate komenda using v1, v2, v3, v1, v1;
end;
Run Code Online (Sandbox Code Playgroud)

第二:

declare 
  komenda varchar2(255);
  v1 varchar2(10):='id_osrodek';
  v2 varchar2(10):='nazwa_o';
  v3 varchar2(10):='osrodki';
begin
  komenda := 'select distinct e.id_student, p.nazwa_p, e.' || v1 || ', o.' || v2 || ' from egzaminy e
    inner join '|| v3 ||' o on o.' || v1 || ' = e.' || v1 || '
    inner join przedmioty p on e.id_przedmiot = p.id_przedmiot';
  execute immediate komenda;
end;
Run Code Online (Sandbox Code Playgroud)

我想知道为什么首先不起作用?

Bal*_*app 6

因为绑定变量是值或值地址,而不是表或列名。

绑定变量

SQL 语句中的占位符,必须用有效值或值地址替换,语句才能成功执行。通过使用绑定变量,您可以编写在运行时接受输入或参数的 SQL 语句。

绑定发生在解析之后,但是如果不知道所需的表和列,则无法解析语句。