【问题标题】:Error(14,7): PLS-00049: bad bind variable错误(14,7):PLS-00049:绑定变量错误
【发布时间】:2017-08-16 10:29:30
【问题描述】:

我已经尝试了所有方法,但 Oracle 11g Express Edition 给我这个过程的错误。

错误(14,7):PLS-00049:绑定变量错误

这是我的程序

create or replace procedure select_member_data
AS
 memberdata      MEMBER%rowtype;
 member_ID    MEMBER.MEMBER_ID%TYPE;
 first_name   MEMBER.FIRST_NAME%TYPE;
 last_name    MEMBER.LAST_NAME%TYPE;
 address      MEMBER.ADDRESS%TYPE;
 total_rows number(2);
BEGIN
 SELECT MEMBER_ID,first_name,last_name,address
 INTO :memberdata
 FROM MEMBER where member_id= 1 ;
 IF sql%notfound THEN  
  dbms_output.put_line('no records fetched');  
 ELSIF sql%found THEN     
  dbms_output.put_line( total_rows ||' fetched');  
 END IF;   
END;

这是我的桌子

CREATE TABLE MEMBER (
MEMBER_ID  INT PRIMARY KEY,
LAST_NAME VARCHAR2(25) NOT NULL,
FIRST_NAME varchar2(25),
ADDRESS varchar2(100),
CITY varchar2(30),
PHONE varchar2(15),
JOIN_DATE  date  DEFAULT SYSDATE NOT NULL  
);

【问题讨论】:

    标签: oracle plsql


    【解决方案1】:

    你正在做:

     SELECT MEMBER_ID,first_name,last_name,address
     INTO :memberdata
     ...
    

    memberdata 是本地 PL/SQL 变量,而不是绑定变量,所以它应该只是:

     SELECT MEMBER_ID,first_name,last_name,address
     INTO memberdata
     ...
    

    您也没有将足够的列提取到您的 %rowtype 变量中。您的表有七列,因此您的 memberdata 记录变量也有七个字段;但您的查询仅选择四列 - 这还不够。 (有点令人困惑的是,这被报告为值过多,而不是值不足)。

    您可以列出所有列名,但在这种情况下使用* 可能更好(或至少是合理的):

     SELECT *
     INTO memberdata
     ...
    

    或者你已经定义了其他变量,你可以这样做:

     SELECT MEMBER_ID,first_name,last_name,address
     INTO member_ID, first_name, last_name, address
     ...
    

    虽然我强烈建议您不要使用与列名相同的变量名;通常在局部变量前面加上一些可以识别它们的东西,例如l_member_id.

    你的逻辑是有缺陷的。如果您的查询没有得到准确的一行,则会抛出 no-data-found 或 too-many-rows 异常。 (由于这里的主键,您不能拥有多个,但您找不到)。将无法到达sql%notfound 检查。

    【讨论】:

    • 非常感谢您的回答,但如果我将其更改为 memberdata,那么我会收到太多值错误
    • @varnit - 我只是添加了一点,您必须选择所有列(或等效的表达式/值) - 查询中的列数必须与中的字段数相匹配您选择的记录。
    • 非常感谢老兄,我好几个小时都在纠结这个问题
    • Here 你会发现有人回答你时该怎么做。
    • @AlexPoole 在PL/SQL中,占位符也可以用于输出变量。
    猜你喜欢
    • 1970-01-01
    • 2020-10-06
    • 1970-01-01
    • 2019-06-05
    • 2015-08-09
    • 1970-01-01
    • 2020-10-22
    • 2022-06-13
    • 1970-01-01
    相关资源
    最近更新 更多