【问题标题】:Invalid SQL Statements on "DEFINE" commands Oracle Database“DEFINE”命令 Oracle 数据库中的 SQL 语句无效
【发布时间】:2015-03-09 14:33:53
【问题描述】:

我是 oracle 新手,当我尝试使用 define 命令时,遇到 ORA-00900: invalid SQL statement 错误。这是我的代码:

DEFINE p_num1 = 2;
DEFINE p_num2 = 4;
declare
  b1 number(7,3) := &p_num1;
  b2 number(7,3) := &p_num2;
  v_cont number(7,3);
begin
  v_cont := &p_num1/&p_num2;
  dbms_output.put_line(v_cont);
end;
/

我错在哪部分?

【问题讨论】:

  • DEFINE 不是 SQL*Plus、SQL 或 PL/SQL 关键字。它存在于 T-SQL 中。我不完全确定我是否理解您要完成的任务——为什么在您已经拥有 b1b2 时还要定义 p_num1p_num2?您是否希望提示用户输入值 2 和 4,而不是将变量初始化为硬编码值?
  • 我试图将 p_num1 除以 p_num2。我不太确定我是否可以直接在我的代码中使用 DEFINE 值,所以我将它分配给新变量。我玩过代码,但它保持不变
  • 为什么不declare b1 number(7,3) := 2; b2 number(7,3) := 4;?额外的变量集为您提供什么价值?您是否尝试提示用户输入值?
  • 是的,我认为这是愚蠢的代码。但这是 PL/SQL 任务的一部分,我正在努力做到这一点。问题是我不能用 DEFINE 值划分一些东西吗?
  • @Justin, DEFINE 是一个 SQL*Plus 命令;我不知道你为什么不这么认为?

标签: oracle plsql oracle-apex


【解决方案1】:

我认为问题在于,无论您如何运行代码,它都将整个事情视为一个语句。实际上,有三个 - 两个 DEFINEs(这是一个 SQL*Plus 命令,大多数其他 GUI 数据库工具都已复制)和一个 PL/SQL 块。

如果您使用 SQL*Plus 运行上述程序,它应该可以工作,因为每个语句将被单独解释。

如果您使用的是 Toad 或 SQL Developer 之类的工具,并且想要一个接一个地执行多个语句,那么您需要将它们作为脚本运行。

如果您尝试通过一些前端代码(例如 C# 等)执行此操作,那么您最好完全避免使用 DEFINEs,而只使用绑定变量来传递值跨越(虽然我不确定这将如何与匿名 PL/SQL 块一起工作 - 你必须自己查找它!)

预计到达时间: 既然您说您使用的是 APEX,那么this 可能会有一些用处。

【讨论】:

    【解决方案2】:

    我已经很多年没有使用 Oracle,但它看起来像 DEFINE only allows you to create text variables。您现在正在将数字除以字符。

    您仍然可以这样做,只需将它们分配给“1”和“2”,然后将它们转换为数字以便能够使用它们进行操作。但是,正确的方法看起来有点混乱。

    【讨论】:

    • 所以我不能用 DEFINE 值来划分一些东西吗?
    • 看起来它们是文本,所以除以文本对我来说似乎不合适。
    • 如果在计算中使用字符串,Oracle 会将字符串隐式转换为数字。显式转换始终是首选,但我认为这不是问题所在。
    【解决方案3】:
    var p_num1 number;
    var p_num2 number;
    
    exec :p_num1 := 2;
    exec :p_num2 := 4;
    
    col p_num1 new_value p_num1
    col p_num2 new_value p_num2
    
    select :p_num1 p_num1
    ,      :p_num2 p_num2
    from dual;
    
    
    select :p_num1/:p_num2 from dual;
    select '&p_num1'/'&p_num2' from dual;
    
    
    declare
      b1 number(7,3) := :p_num1;
      b2 number(7,3) := :p_num2;
      v_cont number(7,3);
    begin
      v_cont := b1/b2;
      dbms_output.put_line(v_cont);
    end;
    /
    

    输出

    PL/SQL procedure successfully completed.
    
    
    PL/SQL procedure successfully completed.
    
    
        P_NUM1     P_NUM2
    ---------- ----------
         2      4
    
    
    :P_NUM1/:P_NUM2
    ---------------
             .5
    
    old   1: select '&p_num1'/'&p_num2' from dual
    new   1: select '     2'/'         4' from dual
    
       '2'/'4'
    ----------
        .5
    
    .5
    
    PL/SQL procedure successfully completed.
    

    编辑

    DEFINE p_num1 = 2;
    DEFINE p_num2 = 4;
    
    var p_num1 number;
    var p_num2 number;
    
    exec :p_num1 := '&p_num1';
    exec :p_num2 := '&p_num2';
    
    declare
      b1 number(7,3) := :p_num1;
      b2 number(7,3) := :p_num2;
      v_cont number(7,3);
    begin
      v_cont := :p_num1/:p_num2;
      dbms_output.put_line(v_cont);
    end;
    /
    

    【讨论】:

    • 非常感谢您的回答。但这不是我要找的。这是我的 PL/SQL 任务的一部分,需要 DEFINE 来划分两个变量
    • 你为什么不详细解释一下你的任务。这是一个要求您在 Oracle APEX 中使用DEFINE 的家庭作业问题吗?这对我来说没有多大意义; DEFINE 是一个脚本命令,而不是你从非脚本调用 PL/SQL 时使用的命令。
    • @AbidFamasya 这没有任何意义。但是我添加了另一个解决方案。顺便说一句,您的代码 sn-p 对我来说很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-07
    • 2017-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多