这是Oracle与SQL server最明显的不同之一,在Oracle过程中,不能使用“select * from tb_name”的方式显示查询结果(SQL server、Sybase都是可以的)。而只能事先定义变量,然后使用INTO语句将查询结果存入变量,再使用DBMS_OUTPUT.PUT_LINE('phone_no:' || 变量名)的方式显示变量的值。
给你一个例子,自己研究吧: -------------------------- 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;
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 过程被成功完成
换成插入,还是有错阿 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
此话有据否,我可是参考oracle实用教程上的例子来写的呀
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有定义?
更正create or replace procedure pro1 (CUR OUT SS.CUR_05) AS BEGIN OPEN CUR FOR SELECT * FROM PUBLISHERS; --lz这里少了一个“分号” END procedure ;
换成插入,还是有错阿 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
非也。 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 /警告: 创建的过程带有编译错误。
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 没有写空格
publishers是不是你可以默认访问的表或视图??
给你看我为你的问题写的测试例题。请对照 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;你看编译还有问题否
--------------------------
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;
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 过程被成功完成
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
(CUR OUT SS.CUR_05)
AS
BEGIN
OPEN CUR FOR
SELECT * FROM PUBLISHERS; --lz这里少了一个“分号”
END;另外,是否可以保证SS\SS.CUR_05\PUBLISHERS有定义?
(CUR OUT SS.CUR_05)
AS
BEGIN
OPEN CUR FOR
SELECT * FROM PUBLISHERS; --lz这里少了一个“分号”
END procedure ;
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
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 /警告: 创建的过程带有编译错误。
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
没有写空格
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;你看编译还有问题否
你的pl/sql块改为存储过程的话,怎么写(用游标,也就是显示多条)?