sqlplus pl/sql Date/Time 用户输入理解为绑定变量
Posted
技术标签:
【中文标题】sqlplus pl/sql Date/Time 用户输入理解为绑定变量【英文标题】:Sqlplus pl/sql Date/Time user input understood as bind variable 【发布时间】:2014-04-16 00:58:58 【问题描述】:我遇到了一个奇怪的问题。
我有一个小的 pl/sql 匿名块,它提示用户输入日期。我想稍后在查询中重新使用此日期,但我收到类似“SP2-0552:绑定变量“01”未声明。”的错误。
问题是时间中的“:01”被解释为绑定变量。一种解决方法是输入报价“2014/04/16 01:01:01”之间的日期,而不是直接输入 2014/04/16 01:01:01。 但是,我希望能够在没有报价的情况下输入我的日期。
这是一个简单的脚本:
declare
adate VARCHAR2(20);
begin
adate := &adate;
query := 'select to_date(''' || adate ||''', ''YYYY/MM/DD HH24:MI:SS'') from dual';
dbms_output.put_line(query);
end;
Enter value for adate: 2014/04/15 01:01:01
old 4: adate := &adate;
new 4: adate := 2014/04/15 01:01:01;
SP2-0552: Bind variable "01" not declared.
【问题讨论】:
您正在使用替换变量 - 因此该值将像代码一样被粘贴。这就是为什么你需要''quotes'
'。注意:请注意此处的 SQL 注入漏洞。例如用户可以输入类似'; execute immediate 'drop table bobby';
SQL*Plus how to accept text variable from prompt?的可能重复
感谢 Jeffrey,但没有注射风险。该脚本仅供团队成员临时使用。
【参考方案1】:
我找到了答案。
变量必须在脚本中的引号之间。
declare
adate VARCHAR2(20);
begin
adate := '&adate';
query := 'select to_date(''' || adate ||''', ''YYYY/MM/DD HH24:MI:SS'') from dual';
dbms_output.put_line(query);
end;
【讨论】:
以上是关于sqlplus pl/sql Date/Time 用户输入理解为绑定变量的主要内容,如果未能解决你的问题,请参考以下文章
在 linux 中使用 sqlplus 部署 pl sql .sql 脚本
ORACLE 在 SQLPLUS 与 PL/SQL 中显示乱码的问题
oracle数据库中有数据,通过pl/sql查询不到,用sqlplus能查到,PL/SQL developer会对数据进行本地缓存