执行过程时pl / sql代码出错Error(9,1):PLS-00103:遇到符号“VAR”

时间:2017-11-22 15:51:26

标签: sql oracle plsql

此代码:

set serveroutput on;  
    CREATE OR REPLACE PROCEDURE TAX_COST_SP(  
      p_state  IN BB_TAX.STATE%TYPE,  
      p_subtotal IN BB_TAX.TAXRATE%TYPE,  
      p_tax_amount OUT BB_TAX.TAXRATE%TYPE)  
    IS  
    BEGIN  
     SELECT TAXRATE*p_subtotal INTO p_tax_amount FROM BB_TAX WHERE  STATE='p_state';
    END TAX_COST_SP;  
    var G_TAX NUMBER;  
    EXECUTE TAX_COST_SP('VA',100,:G_TAX);  
    dbms_output.put_line(g_tax);]  

产生以下错误:

  

执行过程时pl / sql代码出错Error(9,1):PLS-00103:   遇到符号“VAR”

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:0)

这样的东西对你有用

DECLARE
var G_TAX NUMBER;  
 CREATE OR REPLACE PROCEDURE TAX_COST_SP(  
  p_state  IN BB_TAX.STATE%TYPE,  
  p_subtotal IN BB_TAX.TAXRATE%TYPE,  
  p_tax_amount OUT BB_TAX.TAXRATE%TYPE)  
 IS  
 BEGIN  
 SELECT TAXRATE*p_subtotal INTO p_tax_amount FROM BB_TAX WHERE  
 STATE='p_state';
 END TAX_COST_SP;  

 BEGIN
 EXECUTE TAX_COST_SP('VA',100,:G_TAX);  
 dbms_output.put_line(g_tax);
 END;

答案 1 :(得分:0)

这些解决方案存在结构性问题。首先,“创建或替换 StoredProcedureType ....结束”代表它自己,不能在plsql块中,“Declare”打开。 (你可以把它放在一个块中,完全包含在ticks(')中,因此是一个字符串,然后使用execute immediate。)它是DDL“Create table”的代码。所以它需要来自声明或更好的另一个会话或至少一个单独的缓冲区(假设你正在使用sqlplus)。其次,“var”和“execute”是slqplus命令而不是plsql语句;所以他们也不会进入plsql块。在一个块中,您不需要告诉plsql您正在定义一个变量;只是定义它。你也没有使用EXECUTE来调用一个程序;只需使用它的名称并提供参数。在sqlplus中使用单斜杠(/)告诉sqlplus运行进程。所以你的单个sqlplus缓冲区变为:

 Create Or Replace Procedure tax_cost_sp(  
     p_state  in bb_tax.state%type,  
     p_subtotal in bb_tax.taxrate%type,  
     p_tax_amount out bb_tax.taxrate%type)  
 is  
 begin  
     select taxrate*p_subtotal 
       into p_tax_amount 
       from bb_tax 
      where state='p_state';
 end tax_cost_sp;  
/
-- BETTER to start new session or buffer here
declare
  g_tax number; 
begin
    tax_cost_sp('VA',100,g_tax);  
    dbms_output.put_line(g_tax);
 end;
/ 

现在,您在程序中遇到严重错误。 WHERE子句告诉Oracle检索包含文字“p_state”的状态,而不是参数p_state的内容。除非表包含值为“p_state”的STATE列,否则将获得NO_DATA_FOUND异常。您的WHERE子句应为:

 where state=p_state;

最后,由于您要计算单个值,请考虑函数而不是过程。然后,您可以在SQL中使用它,如下所示(您无法使用过程)。

Select tax_cost_sp('VA',100) from dual;