呵呵,这个问题其实很简单。在你的body块中也就是执行那一句你是做了一个查询。而对于一个过程来说。你的这句话他觉得很无趣。所以他觉得你用过程居然做这么简单的事情实在让他很失望,于是抗议你。做出这种错误报给你我的解释是用的很通俗的话,没有什么术语。其实你若是在select语句中做一个插入动作都会没问题了。因为单单的查询是没意义的。告诉你原因后,结合你的需求,你可以把这个操作复杂一点。稍微改变一点就没错了

解决方案 »

  1.   

    这是Oracle与SQL server最明显的不同之一,在Oracle过程中,不能使用“select * from tb_name”的方式显示查询结果(SQL server、Sybase都是可以的)。而只能事先定义变量,然后使用INTO语句将查询结果存入变量,再使用DBMS_OUTPUT.PUT_LINE('phone_no:' || 变量名)的方式显示变量的值。
      

  2.   

    给你一个例子,自己研究吧:
    --------------------------
    DECLARE
    TYPE phoneNum IS RECORD (
    phone_no VARCHAR(13) NOT NULL DEFAULT '----', /* 手机号 */
    city_code VARCHAR(4) NOT NULL DEFAULT '----', /* 所属城市代码 */
    city_name VARCHAR(8) NOT NULL DEFAULT '----', /* 所属城市名称 */
    state VARCHAR(6) NOT NULL DEFAULT '----', /* 所属省份 */
    type VARCHAR(6) NOT NULL DEFAULT '----' /* 号段类型 */
    );
    selPart phoneNum;
    BEGIN
    SELECT phone_no,city_code,city_name,state,type 
    INTO selPart
    FROM tb_phone_no
    WHERE phone_no='1333241';
    DBMS_OUTPUT.PUT_LINE('phone_no:' || selPart.phone_no ||
    ' city_code:' || selPart.city_code ||
    ' city_name:' || selPart.city_name ||
    ' state:' || selPart.state ||
    ' type:' || selPart.type);
    END;
      

  3.   

    SQL> set serveroutput on
    SQL> 
    SQL> DECLARE
      2   TYPE phoneNum IS RECORD (
      3   phone_no VARCHAR(13) NOT NULL DEFAULT '----', /* 手机号 */
      4   city_code VARCHAR(4) NOT NULL DEFAULT '----', /* 所属城市代码 */
      5   city_name VARCHAR(8) NOT NULL DEFAULT '----', /* 所属城市名称 */
      6   state VARCHAR(6) NOT NULL DEFAULT '----', /* 所属省份 */
      7   type VARCHAR(6) NOT NULL DEFAULT '----' /* 号段类型 */
      8   );
      9   selPart phoneNum;
     10  BEGIN
     11   SELECT phone_no,city_code,city_name,state,type
     12   INTO selPart
     13   FROM tb_phone_no
     14   WHERE phone_no='1333241';
     15   DBMS_OUTPUT.PUT_LINE('phone_no:' || selPart.phone_no ||
     16   ' city_code:' || selPart.city_code ||
     17   ' city_name:' || selPart.city_name ||
     18   ' state:' || selPart.state ||
     19   ' type:' || selPart.type);
     20  END;
     21  /
    phone_no:1333241 city_code:024 city_name:沈阳 state:辽宁 type:CDMAPL/SQL 过程被成功完成
      

  4.   

    换成插入,还是有错阿
    SQL>  create or replace procedure pro1
      2   (pubid in char(4),pubname in varchar(20),citty in varchar(8))
      3   as
      4   begin
      5   insert into publishers
      6   values(pubid,pubname,cityy);
      7   end pro1;
      8   /警告: 创建的过程带有编译错误。SQL> exec pro1('P003','南京大学出版社','南京');
    BEGIN pro1('P003','南京大学出版社','南京'); END;      *
    ERROR 位于第 1 行:
    ORA-06550: 第 1 行, 第 7 列:
    PLS-00905: 对象 SYSTEM.PRO1 无效
    ORA-06550: 第 1 行, 第 7 列:
    PL/SQL: Statement ignored
      

  5.   

    此话有据否,我可是参考oracle实用教程上的例子来写的呀
      

  6.   

    create or replace procedure pro1
    (CUR OUT SS.CUR_05)
    AS 
    BEGIN
    OPEN CUR FOR
    SELECT * FROM PUBLISHERS; --lz这里少了一个“分号”
    END;另外,是否可以保证SS\SS.CUR_05\PUBLISHERS有定义?
      

  7.   

    更正create or replace procedure pro1
    (CUR OUT SS.CUR_05)
    AS 
    BEGIN
    OPEN CUR FOR
    SELECT * FROM PUBLISHERS; --lz这里少了一个“分号”
    END procedure ;
      

  8.   

    换成插入,还是有错阿
    SQL>  create or replace procedure pro1
      2   (pubid in char(4),pubname in varchar(20),citty in varchar(8))
      3   as
      4   begin
      5   insert into publishers
      6   values(pubid,pubname,cityy);
      7   end pro1;
      8   /警告: 创建的过程带有编译错误。SQL> exec pro1('P003','南京大学出版社','南京');
    BEGIN pro1('P003','南京大学出版社','南京'); END;      *
    ERROR 位于第 1 行:
    ORA-06550: 第 1 行, 第 7 列:
    PLS-00905: 对象 SYSTEM.PRO1 无效
    ORA-06550: 第 1 行, 第 7 列:
    PL/SQL: Statement ignored
    =============================================你的例题测试之所以错误是因为犯了常识性的错误
    你的过程如果带有参数,则参数后面不要有参数了(就是不要有精度范围)你把所有的范围都去掉就OK了比如pubid in char(4),pubname in varchar(20),citty in varchar(8)
    这一句改成pubid in char,pubname in varchar,citty in varchar
      

  9.   

    非也。
    SQL>   create or replace procedure pro1
      2   (pubid in char,pubname invarchar,citty in varchar)
      3  as 
      4  begin
      5  insert into publishers
      6  values(pubid,pubname,citty);
      7  end pro1;
      8  /警告: 创建的过程带有编译错误。
      

  10.   

    create or replace procedure pro1
      2   (pubid in char,pubname invarchar,citty in varchar)
      3  as 
      4  begin
      5  insert into publishers
      6  values(pubid,pubname,citty);
      7  end pro1;
      8  /
    pubname invarchar
    没有写空格
      

  11.   

    publishers是不是你可以默认访问的表或视图??
      

  12.   

    给你看我为你的问题写的测试例题。请对照
    create table abc
    (
     userid char(4),
     username varchar2(20),
     userage number
    );create or replace procedure apro
    (userid in char,username in varchar,age in number)
    as 
    begin
    insert into abc values(userid,username,age);
    end apro;你看编译还有问题否
      

  13.   

    乘务员先生:
    你的pl/sql块改为存储过程的话,怎么写(用游标,也就是显示多条)?