问个oracle中执行包中的存储过程问题

AA123456 2008-12-12 07:48:56
小弟对oracle不熟,请多多指教:
我在oracle数据库中建立了包:TestP 这个包的包体中包含一个存储过程 TestProcedure它需要个参数 _PP
我现在用 前台页面如何调用这个存储过程啊?
******注意:不用comm.CommandType = CommandType.StoredProcedure 这种方式调

在sql server 中对于没有返回值的存储过程可以直接用Sql语句方式调 comm.CommandText=" exec 存储过程名'参数值'";
这样就可以了,
我想在oracle中如何用Sql语句调用这个包中的带参数的存储过程啊?
...全文
486 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
lihongli1989 2011-12-13
  • 打赏
  • 举报
回复
好,表的字段都有什么啊,我也想练练,我对这个Oracle存储过程不熟,现在正在学习当中
tinalucky 2008-12-16
  • 打赏
  • 举报
回复

  SQL> create or replace procedure get_news(
  2 aid in varchar2,atitle in varchar2)
  3 as
  4 begin
  5 select * from cf_news
  6 end;
  7 /
  
  警告: 创建的过程带有编译错误。
  
  SQL> create or replace procedure get_news(
  2 aid in varchar2 ,atitle in varchar2)
  3 as
  4 beging
  5 /
  
  警告: 创建的过程带有编译错误。
  
  SQL> create or replace procedure get_news(
  2 aid in varchar2)
  3 as
  4 begin
  5 select * from cf_news;
  6 end;
  7 /
  
  警告: 创建的过程带有编译错误。
  
  SQL> create or replace procedure get_news
  2 as
  3 begin
  4 select * from cf_news;
  5 end;
  6 /
  
  警告: 创建的过程带有编译错误。
  
  SQL> show errors;
  PROCEDURE GET_NEWS 出现错误:
  
  LINE/COL ERROR
  -------- -------------------------------------
  4/1   PLS-00428: 在此 SELECT 语句中缺少 INTO 子句
  SQL> create or replace procedure get_news
  2 as
  3 aa number;
  4 begin
  5 select count(*) into aa from cf_news;
  6 end;
  7 /
  
  过程已创建。
  
  SQL> create or replace procedure get_news
  2 as
  3 aa number;
  4 begin
  5 select count(*) into aa from cf_news;
  6 dbms_outpub.put_line('aa='aa);
  7 end;
  8 /
  
  警告: 创建的过程带有编译错误。
  
  SQL> show errors;
  PROCEDURE GET_NEWS 出现错误:
  
  LINE/COL ERROR
  -------- -----------------------------------------
  6/1   PLS-00201: 必须说明标识符 'DBMS_OUTPUB.PUT_LINE'
  6/1   PL/SQL: Statement ignored
  SQL> create or replace procedure get_news
  2 as
  3 aa number;
  4 begin
  5 select count(*) into aa from cf_news;
  6 dbms_output.put_line('aa='aa);
  7 end;
  8 /
  
  过程已创建。
  
  SQL> set serverout on;
  SQL> execute get_news;
  aa=3
  
  PL/SQL 过程已成功完成。 --这成功执行了


AA123456 2008-12-14
  • 打赏
  • 举报
回复
To: tinalucky 谢谢,谢谢
我又新建了一个存储过程,这回状态显示的是Valid了,在SQLPLUS中执行成功,但是用上面的程序调用
:SQL语句是这样写的: ececute TestPR(1); 还是提示无效SQL语句,但在SQLPLUS中同样这样写提示执行成功
,请问是什么原因??
tinalucky 2008-12-14
  • 打赏
  • 举报
回复
那就奇怪了,我怎么能运行呢?下面是我在winform中演示的代码,能成功运行并显示数据的。数据库是SQL server。明天上班有空我再用ORACLE测测
bool flag = false;
string strConn = "server=.; database=TEST; uid=sa; pwd=cyl123";
SqlConnection conn = new SqlConnection(strConn);
SqlCommand comd = new SqlCommand("EXEC PRO_SELECTSTUDENT @PRO_STDAGE=25",conn);
comd.CommandType = CommandType.Text;
try
{
conn.Open();
DataSet ds = new DataSet();
SqlDataAdapter adapter = new SqlDataAdapter(comd);
adapter.Fill(ds);
this.dataGrid1.DataSource = ds;
flag = true;
}
catch(Exception ex)
{
throw ex;
}
finally
{
conn.Close();
}

return flag;
mengxj85 2008-12-13
  • 打赏
  • 举报
回复
对Oracle不熟,帮顶
tinalucky 2008-12-13
  • 打赏
  • 举报
回复
不好意思,因为手头没有ORACLE只在SQL SERVER的查询分析器中试了一下
create database TEST
GO

CREATE TABLE TSTUDENT
(
STDNAME VARCHAR(12),
STDAGE INT
)
GO

INSERT INTO TSTUDENT VALUES('TINA',24)
GO
INSERT INTO TSTUDENT VALUES('LUCKY',24)
GO
INSERT INTO TSTUDENT VALUES('TINALUCKY',25)
GO

SELECT * FROM TSTUDENT
GO

IF EXISTS(SELECT NAME FROM sysobjects WHERE NAME='PRO_SELECTSTUDENT' AND type='p')
DROP PROCEDURE PRO_SELECTSTUDENT
GO
CREATE PROCEDURE PRO_SELECTSTUDENT
@PRO_STDAGE INT
AS
BEGIN
--DECLARE @PRO_TEMPSTDAGE INT
SELECT * FROM TSTUDENT WHERE STDAGE = @PRO_STDAGE
END
GO

EXEC PRO_SELECTSTUDENT @PRO_STDAGE=25--执行储存过程


执行结果为
STDNAME STDAGE
1 TINALUCKY 25
tinalucky 2008-12-13
  • 打赏
  • 举报
回复
EXEC TestP.TestProcedure @变量=2
tinalucky 2008-12-13
  • 打赏
  • 举报
回复
在Oracle Enterprise Manager Console操作个人感觉不怎么好使,我在公司使用的是第三方软件PLSQLDev,现在家里的只装了客户端,所以没法帮你测试。不过似乎是你创建的储存过程有问题,既然创建成功了为什么会是nvalid呢?这样吧,你上网找个例子跟着创建一下,看看是不是还是invalid这种情况
AA123456 2008-12-13
  • 打赏
  • 举报
回复
To : tinalucky 太感谢你这么热心麻烦你帮我再看一下好吧

在SQL*Plus下执行不能成功:

我在是这样做的不写包了,直接写过程了
我的存储过程就一句话,就是select * from Test; (Test表也是建立在TestUser方案的表)
在Oracle Enterprise Manager Console中创建过程 提示创建过程成功,但是在打开那个过程,
一直显示过程状态为invalid。过程就创建在我新建的TestUser的方案中。

在SQL*Plus中想执行该过程,提示如下:
ERROR 位于第 1 行:
ORA-06550: 第 1 行, 第 18 列:
PLS-00905: 对象 TESTUSER.TESTPR 无效
ORA-06550: 第 1 行, 第 7 列:
PL/SQL: Statement ignored

请问一下为什么总是状态为invalid 到底哪里错了?
tinalucky 2008-12-13
  • 打赏
  • 举报
回复
噢,明白楼主的意思,理论上是可以这样。不过,首先你肯定ORACLE能执行这句Exec TESTPACKEAGE.getSeniorHighSchool(1) ?在PL/SQL能执行吗?
AA123456 2008-12-13
  • 打赏
  • 举报
回复
可能是我描述的不清楚,:
这回放原码:
问题是这样:
我在oracle中定义一个包:
CREATE OR REPLACE PACKAGE "TESTUSER"."TESTPACKEAGE"
type outlist is REF CURSOR;
 
 
 Procedure getSeniorHighSchool(
    return_list out outlist
 );

CREATE OR REPLACE PACKAGE BODY "TESTUSER"."TESTPACKEAGE"

Procedure getSeniorHighSchool(
    return_list out outlist
 )as
 
 begin
 
 
   open return_list
  
    for
    
     select * from Test
     
 end;

以上是我Oracle中定义的一个包
我现在想在CS页面里访问这个包
OleDbConnection conn = new OleDbConnection();
conn.ConnectionString = "Provider=msdaora;Data Source=OracleDB;User Id=;Password=;";
OleDbCommand comm = new OleDbCommand();
OleDbTransaction trans = null;


comm.Connection = conn;
comm.CommandText = " Exec TESTPACKEAGE.getSeniorHighSchool(1) "; *******主要是这里的Sql 语句如何写我想用SQL语句的访问形式而不是comm.CommandType = CommandType.StoredProcedure这种形式,*******************

DataSet dataSet = new DataSet();
OleDbDataAdapter adapter = new OleDbDataAdapter();
try
{

conn.Open();
trans = conn.BeginTransaction();

comm.Transaction = trans;
adapter.SelectCommand = comm;
adapter.Fill(dataSet, "table");
trans.Commit();
return dataSet.Tables["table"];
}
catch
{
if (trans != null) trans.Rollback();
throw;
}
finally{conn.close();}

问题是*****标注的那块语句我不知咋写
AA123456 2008-12-13
  • 打赏
  • 举报
回复
TO:tinalucky
EXEC PRO_SELECTSTUDENT @PRO_STDAGE=25--执行储存过程
在oracle中还是提示无效Sql语句

AA123456 2008-12-12
  • 打赏
  • 举报
回复
TO :tinalucky
还是报无效SQL语句
那请问在SQLPlus如何执行这个带参数的存储过程啊?
tinalucky 2008-12-12
  • 打赏
  • 举报
回复
comm.CommandText = " Exec('TestP.TestProcedure(2)') ";
comm.CommandType = CommandType.Text
AA123456 2008-12-12
  • 打赏
  • 举报
回复
To:wuyq11
谢谢你的回答,不过我要的不是你说的那些种,我不想用comm.CommandType = CommandType.StoredProcedure
这种方式调用,
我想用的还是
comm.CommandText = " Exec TestP.TestProcedure(2); ";
comm.CommandType = CommandType.Text
这样调用
但上面的情况下老提示Sql语句无效,请问应如何写
wuyq11 2008-12-12
  • 打赏
  • 举报
回复
参考
http://www.cnblogs.com/wf5360308/articles/251374.html
相当不错的技术文档。 前言 1 第一章 oracle存储过程概述 2 1.1 存储过程基本结构(PROCEDURE) 3 1.1.1创建存储过程 3 1.1.2 存储过程删除 5 1.1.3 调用存储过程 5 1.2存储函数(FUNCTIONE) 6 1.2.1 创建存储函数 6 1.2.2 删除存储函数 7 1.3 包(package) 7 1.3.1 包的基本结构 7 1.3.2 包的创建 7 1.3.3 调用元素 9 1.3.4 包的修改和删除 9 第二章 oracle存储过程基础――PL/SQL 9 2.1 pl/sql基础 9 2.1.1 PL/SQL简介 9 2.1.2 一个简单的PL/SQL块 10 2.1.3 PL/SQL流程控制 13 2.2 游标(CURSOR) 17 2.2.1 游标的概念 18 2.2.2 游标的属性 18 2.2.3 游标FOR循环的使用 20 2.2.4 带参数游标的使用方法 20 2.3 动态SQL语句 21 2.4 例外处理 22 2.5 一个完整的PL/SQL实例 24 第三章 oracle存储过程讨论 25 3.1 函数(FUNCTION) 26 3.1.1 用户函数创建,编译,删除 26 3.1.2 参数传递 27 3.2 存储过程 28 3.3 包 29 3.3.1 创建包 30 3.3.2 删除包 30 3.3.3 应用举例 31 3.4 UTL_FILE包的使用 33 3.4.1 文件控制: 34 3.4.2 文件输出: 34 3.4.3 文件输入: 35 3.4.4 应用举例 35 4.1 Wrapper应用 35 第四章 存储过程运行环境 36 4.1 存储过程以及PL/SQL执行环境 36 4.1.1 SQL*PLUS环境 36 4.1.2 Pro*c预编译环境 37 4.2 存储过程调试方法 38 4.2.1 SQL*PLUS环境显示错误 38 4.2.2 插入测试表调试存储过程 38 4.2.3 DBMS_OUTPUT系统内置包 39 附录一 sql*plus工具 40 附录1.1 sql*plus启动和关闭 41 附录1.2 sql*plus 环境设置 42 附录1.3 设置环境参数 42 附录1.4 sqlplus命令的执行 43 附录1.5 sql*plus编辑命令 43

62,269

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧