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 用户输入理解为绑定变量的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQLPlus 中运行 PL/SQL 代码?

在 linux 中使用 sqlplus 部署 pl sql .sql 脚本

如何在 SQLPlus 或 PL/SQL 中制作菜单?

ORACLE 在 SQLPLUS 与 PL/SQL 中显示乱码的问题

SQL Plus和PL/SQL

oracle数据库中有数据,通过pl/sql查询不到,用sqlplus能查到,PL/SQL developer会对数据进行本地缓存