oracle带参数的存储过程

本文详细解析了PLS-00103错误,即在Oracle PL/SQL中不当使用括号导致的问题。通过对比错误与正确代码,阐述了在存储过程参数声明中避免指定数据类型长度的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 PLS-00103: 出现符号 "("在需要下列之一时:
         := . ) , @ %
         default character
         符号 ":=" 被替换为 "(" 后继续。

错误分析:存储过程各参数类型,不需要制定范围,比如varchar2(12)写成varchar2就可以了

错误代码:
CREATE OR REPLACE PROCEDURE query_adoutCus(cus_id IN varchar2(12))
AS
V_phoneunum VARCHAR2(10);
V_usingmt varchar2(60);
BEGIN
SELECT phonenum,usingmt INTO V_phoneunum,V_usingmt FROM t_customer WHERe id=cus_id;
DBMS_OUTPUT.PUT_LINE('客户信息为--'||'手机号为-'||V_phoneunum||'现用车牌为-'||V_usingmt);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('没有该编号客户!');
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE('有重复客户编号!');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('发生其他错误!');
END;

正确代码:
CREATE OR REPLACE PROCEDURE query_adoutCus(cus_id IN varchar2)
AS
V_phoneunum VARCHAR2(10);
V_usingmt varchar2(60);
BEGIN
SELECT phonenum,usingmt INTO V_phoneunum,V_usingmt FROM t_customer WHERe id=cus_id;
DBMS_OUTPUT.PUT_LINE('客户信息为--'||'手机号为-'||V_phoneunum||'现用车牌为-'||V_usingmt);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('没有该编号客户!');
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE('有重复客户编号!');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('发生其他错误!');
END;
 

### 如何在 Oracle 数据库中执行带参数存储过程 #### 创建带有输入和输出参数的存储过程 创建一个具有输入(IN) 和 输出(OUT) 参数的存储过程,这允许传递数据给存储过程以及接收返回的结果。 ```sql CREATE OR REPLACE PROCEDURE example_procedure ( input_param IN VARCHAR2, output_param OUT NUMBER ) IS BEGIN -- 执行某些操作并将结果赋值给output_param SELECT COUNT(*) INTO output_param FROM employees WHERE department_name = input_param; END; / ``` #### 使用匿名PL/SQL块调用存储过程 当希望测试或直接从SQL*Plus或其他命令行工具运行时,可以通过编写一个匿名PL/SQL块来实现: ```plsql DECLARE v_output NUMBER; BEGIN example_procedure('Sales', v_output); DBMS_OUTPUT.PUT_LINE('Number of Employees in Sales Department: ' || TO_CHAR(v_output)); END; / ``` 此代码定义了一个局部变量`v_output`用于保存来自存储过程的输出,并打印最终结果[^2]。 #### 应用程序层面上调用存储过程 对于Java应用来说,可以利用JDBC API中的CallableStatement接口来进行调用。下面是一个简单的例子展示如何通过Hibernate框架内的方法去调用名为`proc_stuInfo()`的存储过程并向其提供必要的参数: ```java String sql = "{call proc_stuInfo(?)}"; session.doWork(connection -> { try (CallableStatement cs = connection.prepareCall(sql)) { // 设置IN参数 cs.setString(1, "someValue"); // 如果存在OUT参数,则注册它们的数据类型 cs.registerOutParameter(2, Types.VARCHAR); // 调用存储过程 cs.execute(); // 获取并处理OUT参数 String result = cs.getString(2); System.out.println(result); } }); ``` 上述示例展示了如何设置IN参数并通过索引来获取OUT参数的值[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值