“上的SQL语句无效”;定义;命令Oracle数据库

“上的SQL语句无效”;定义;命令Oracle数据库,oracle,plsql,oracle-apex,Oracle,Plsql,Oracle Apex,我是oracle新手,在尝试使用define命令时,遇到ORA-00900:无效SQL语句错误。这是我的代码: 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

我是oracle新手,在尝试使用define命令时,遇到ORA-00900:无效SQL语句错误。这是我的代码:

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;
/

在哪些方面我错了?

我已经好几年没有使用Oracle了,但它看起来像。您现在正在将一个数字除以一个字符

您仍然可以这样做,只需将它们指定为“1”和“2”,然后将它们转换为数字,以便能够使用它们进行操作。但这似乎是一个混乱的正确方法

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;
/

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

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

如果您正在使用Toad或sqldeveloper之类的工具,并且希望一个接一个地执行多个语句,那么您需要将它们作为脚本运行

如果您试图通过一些前端代码(例如C#等)来实现这一点,那么您最好避免使用
DEFINE
s,而只使用bind变量来传递值(尽管我不确定如何使用匿名PL/SQL块-您必须自己查找!)

预计到达时间:
既然你说你在使用APEX,也许会有一些用处。

DEFINE
不是SQL*Plus、SQL或PL/SQL关键字。它存在于T-SQL中。我不完全确定我是否理解您试图实现的目标——为什么您已经有了
b1
b2
,却要定义
punum1
punum2
?您是否希望提示用户输入值2和4,而不是将变量初始化为硬编码值?我正在尝试将p_num1除以p_num2。我不太确定是否可以在代码中直接使用DEFINE值,所以我将其分配到新变量中。我已经玩了代码,但它仍然是一样的为什么不
声明b1编号(7,3):=2;b2数(7,3):=4?附加变量集为您提供了什么值?你想提示用户输入值吗?是的,我认为这是一个愚蠢的代码。但这是PL/SQL任务的一部分,我正在努力做到这一点。问题是我不能用定义值来划分一些东西吗?@Justin,
DEFINE
是一个SQL*Plus命令;我不知道你为什么不这么认为?那么我不能用定义值来划分一些东西吗?看起来它们是文本,所以用文本来划分对我来说是不对的。如果在计算中使用字符串,Oracle会将字符串隐式转换为数字。显式转换总是首选,但我认为这不是这里的问题。非常感谢您的回答。但那不是我想要的。这是我的PL/SQL任务的一部分,它需要定义两个变量,为什么不详细解释一下您的任务呢。这是一个家庭作业问题,需要您在Oracle APEX中使用
DEFINE
?这对我来说没有多大意义
DEFINE
是一个脚本命令,而不是从非脚本调用PL/SQL时使用的命令。@AbidFamasya毫无意义。但是我添加了另一个解决方案。顺便说一句,你的代码片段对我来说很好。