【问题标题】:How to define a bind variable called "1" in sqlplus如何在sqlplus中定义一个名为“1”的绑定变量
【发布时间】:2021-11-03 21:24:53
【问题描述】:

我有一个使用绑定变量编写的应用程序:1、2、3.. 我想执行存储在 sql_area 中的执行计划,并使用相同的文本在 sqlplus 中执行查询

举例:

select * from dual where dummy=:1;

如何在 sqlplus 中将“1”定义为绑定变量?

var 1 varchar2(1); doesn't work.

它不将“1”识别为变量名。

【问题讨论】:

  • 我假设当您说“它不将“1”识别为变量名时。”你的意思是你已经尝试过VARIABLE "1" VARCHAR2(1); 但它不起作用?还是那句话中的引用只是误导?
  • 我阅读了“绑定变量”一词,但看到了var 1 ... 的尝试,并假设 OP 可能只需要一个名为“1”的变量。我会等待澄清。
  • MT0: 我试过变量 "1" varchar2(1);也。它没有用。 Jon Armstron:我想要一个名为 1 的变量,不带引号。
  • @joseyluis 是的,这是一个老问题,我也遇到过这个问题,所以我使用自己的脚本来解决这个问题
  • 只需阅读我的答案和对它的评论

标签: sql oracle oracle-sqldeveloper sqlplus


【解决方案1】:

是的,这很烦人,但您可以像这样将查询包装到匿名 PL/SQL 块(脚本)中:

SQL> exec execute immediate 'select count(*) cnt from dual where :1=dummy' using 'x';

PL/SQL procedure successfully completed.

SQL> select sql_id from v$sqlarea a where sql_text like 'select count(*) cnt from dual%';

SQL_ID
-------------
8y7sav2n21055

1 row selected.

SQL> ed tests/run_sql.sql

SQL> !cat tests/run_sql.sql
declare
  vsql clob;
begin
  select sql_fulltext into vsql from v$sqlarea a where a.sql_id='&1';
  execute immediate vsql using &2;
end;
/

SQL> @tests/run_sql.sql 8y7sav2n21055 123

PL/SQL procedure successfully completed.

顺便说一句,SqlCl 有另一个更简单的解决方法:使用alias

SQL> alias sel1=select :1 from dual;
SQL> sel1 123

:1
----------------------------------------------------
123

【讨论】:

  • + 当然,如果你愿意,你可以使用 dbms_sql 代替 execute immediate
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-25
  • 1970-01-01
  • 1970-01-01
  • 2011-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多