当前位置:首页 » 存储配置 » oracle包与存储过程

oracle包与存储过程

发布时间: 2023-05-13 16:46:07

❶ oracle用包还是用存储过程比较好,性能上有什么区别

包和存储过程是两个不同的概念。
包可以理解成类似面向对象语言中的命名空间,而存储过程可以放到包内,这样管理比较方便,而且不会有命名冲突的问题。包内还可以有函数,类型定义等等其他内容。
当然,存储过程可以不放到任何包内的。

❷ Oracle中的包下的存储过程,在c#中什么调用

Code highlighting proced by Actipro CodeHighlighter (freeware)http://www CodeHighlighter com/-->/数据库连接字符串(web.config来配置),可以动态更改connectionString支持多数据库.
public static string connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
/// <summary>
/袜腔// 执行存正磨储过程,返回sqlDataReader ( 注意:调用该方法后,一定要对SqlDataReader进行Close )
/// </summary>
/// <param name="storedProcName">存储过程名</param>
/// <param name="parameters">存储过程参举好斗数</param>
/// <returns>SqlDataReader</returns>
public static SqlDataReader RunProcere(string storedProcName, IDataParameter[] parameters)
{
SqlConnection connection = new SqlConnection(connectionString);
SqlDataReader returnReader;
connection.Open();
SqlCommand command = BuildQueryCommand(connection, storedProcName, parameters);
command.CommandType = CommandType.StoredProcere;
returnReader = command.ExecuteReader(CommandBehavior.CloseConnection);
return returnReader;
}
/// <summary>
/// 执行存储过程
/// </summary>
/// <param name="storedProcName">存储过程名</param>
/// <param name="parameters">存储过程参数</param>
/// <param name="tableName">DataSet结果中的表名</param>
/// <returns>DataSet</returns>
public static DataSet RunProcere(string storedProcName, IDataParameter[] parameters, string tableName)
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
DataSet dataSet = new DataSet();
connection.Open();
SqlDataAdapter sqlDA = new SqlDataAdapter();
sqlDA.SelectCommand = BuildQueryCommand(connection, storedProcName, parameters);
sqlDA.Fill(dataSet, tableName);
connection.Close();
return dataSet;
}
}
public static DataSet RunProcere(string storedProcName, IDataParameter[] parameters, string tableName, int Times)
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
DataSet dataSet = new DataSet();
connection.Open();
SqlDataAdapter sqlDA = new SqlDataAdapter();
sqlDA.SelectCommand = BuildQueryCommand(connection, storedProcName, parameters);
sqlDA.SelectCommand.CommandTimeout = Times;
sqlDA.Fill(dataSet, tableName);
connection.Close();
return dataSet;
}
}
/// <summary>
/// 构建 SqlCommand 对象(用来返回一个结果集,而不是一个整数值)
/// </summary>
/// <param name="connection">数据库连接</param>
/// <param name="storedProcName">存储过程名</param>
/// <param name="parameters">存储过程参数</param>
/// <returns>SqlCommand</returns>
private static SqlCommand BuildQueryCommand(SqlConnection connection, string storedProcName, IDataParameter[] parameters)
{
SqlCommand command = new SqlCommand(storedProcName, connection);
command.CommandType = CommandType.StoredProcere;
foreach (SqlParameter parameter in parameters)
{
if (parameter != null)
{
// 检查未分配值的输出参数,将其分配以DBNull.Value.
if ((parameter.Direction == ParameterDirection.InputOutput || parameter.Direction == ParameterDirection.Input) &&
(parameter.Value == null))
{
parameter.Value = DBNull.Value;
}
command.Parameters.Add(parameter);
}
}
return command;
}
/// <summary>
/// 执行存储过程,返回Output输出参数值
/// </summary>
/// <param name="storedProcName">存储过程名</param>
/// <param name="parameters">存储过程参数</param>
/// <returns>object</returns>
public static object RunProcere(string storedProcName, IDataParameter[] paramenters)
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
SqlCommand command = BuildQueryCommand(connection, storedProcName, paramenters);
command.ExecuteNonQuery();
object obj=command.Parameters["@Output_Value"].Value; //@Output_Value和具体的存储过程参数对应
if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
{
return null;
}
else
{
return obj;
}
}
}
/// <summary>
/// 执行存储过程,返回影响的行数
/// </summary>
/// <param name="storedProcName">存储过程名</param>
/// <param name="parameters">存储过程参数</param>
/// <param name="rowsAffected">影响的行数</param>
/// <returns></returns>
public static int RunProcere(string storedProcName, IDataParameter[] parameters, out int rowsAffected)
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
int result;
connection.Open();
SqlCommand command = BuildIntCommand(connection, storedProcName, parameters);
rowsAffected = command.ExecuteNonQuery();
result = (int)command.Parameters["ReturnValue"].Value;
//Connection.Close();
return result;
}
}
/// <summary>
/// 创建 SqlCommand 对象实例(用来返回一个整数值)
/// </summary>
/// <param name="storedProcName">存储过程名</param>
/// <param name="parameters">存储过程参数</param>
/// <returns>SqlCommand 对象实例</returns>
private static SqlCommand BuildIntCommand(SqlConnection connection, string storedProcName, IDataParameter[] parameters)
{
SqlCommand command = BuildQueryCommand(connection, storedProcName, parameters);
command.Parameters.Add(new SqlParameter("ReturnValue",
SqlDbType.Int, 4, ParameterDirection.ReturnValue,
false, 0, 0, string.Empty, DataRowVersion.Default, null));
return command;
}

❸ 请问我用oracle写了一个包,里面有函数和存储过程,我要怎么样能够知道我写的这个包是正确的呢

验证下不就知道了。
如果你的过程和函数都没有语法错误就是对的。
包:包含表头和BODY信息。
将你的函数和过程头部信息放到包中定义。调用就可以直接调用包里面的定义。扮首
比如:
包:你的包名a.spc
CREATE OR REPLACE PACKAGE a
IS
PROCEDURE CREATE_AE_OUT_FILE (p_gr_hdr_id IN varchar) ;
END;
body:
CREATE OR REPLACE PACKAGE BODY a
IS

PROCEDURE CREATE_AE_OUT_FILE(p_gr_hdr_id IN varchar)
IS
v_gr_hdr_id cosgx.cos_gr_hdr.gr_hdr_id%type;
vfile varchar2(200);

BEGIN
--你的实现逻辑
END;
END;
函数厅皮数也是一样的。都需要在包里面定义

用握顷SQLPLUS就可以自动生成的

❹ ORACLE 获取包中存储过程或函数的参数

该包用于  动态获取包中存储过程或者函数的参数。

create or replace package SF_GET_ARGUMENTS_PKG is

  -- Author  : SANFU

  -- Created : 2020/7/22 14:40:49

  -- Purpose : 动态获取包中存储过程或者函数的参数

  PROCEDURE get_arguments(p_pkg_name in VARCHAR2, p_obj_name in VARCHAR2);

  PROCEDURE pf_get_arguments(p_pkg_name in VARCHAR2,

         茄脊差                   p_obj_name in VARCHAR2);

end SF_GET_ARGUMENTS_PKG;

/

create or replace package body SF_GET_ARGUMENTS_PKG is

  /*============================================*

  * Author  : CZH

  * Created  : 2020-07-22 15:00:12

  * ALERTER  :

  * ALERTER_TIME  :

  * Purpose  :

  * Arg_number  : 2

  * P_PKG_NAME :包名

  * P_OBJ_NAME :存储过程名或函数名

  *============================================*/

  PROCEDURE get_arguments(p_pkg_name in VARCHAR2, p_obj_name in VARCHAR2) IS

    v_pkg_name  varchar2(100) := upper(p_pkg_name);

    v_obj_name  varchar2(100) := upper(p_obj_name);

    v_arg_number NUMBER;

    cursor data_cur is

      select t.PACKAGE_NAME,

            t.OBJECT_NAME,

            t.ARGUMENT_NAME,

            t.IN_OUT,

            count(t.ARGUMENT_NAME) over(PARTITION BY t.OBJECT_NAME) arg_number,

            row_number() over(partition by t.OBJECT_NAME order by t.POSITION asc) rank_position

   颤皮     from sys.user_arguments t

      where t.PACKAGE_NAME = v_pkg_name

        and t.OBJECT_NAME = v_obj_name

        and t.POSITION <> 0;

  begin

    select count(1)

      into v_arg_number

      from sys.user_arguments t

    where t.PACKAGE_NAME = v_pkg_name

      and t.OBJECT_NAME = v_obj_name

      and t.POSITION <野亏> 0;

    dbms_output.put_line('/*============================================*');

    dbms_output.put_line(' * Author  : SANFU');

    dbms_output.put_line(' * Created  : ' ||

                        TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS'));

    dbms_output.put_line(' * ALERTER  : ');

    dbms_output.put_line(' * ALERTER_TIME  : ');

    dbms_output.put_line(' * Purpose  : ');

    dbms_output.put_line(' * Obj_Name    : ' || v_obj_name);

    dbms_output.put_line(' * Arg_Number  : ' || v_arg_number);

    for rec in data_cur loop

      dbms_output.put_line(' * ' || rec.ARGUMENT_NAME || ' :');

    end loop;

    dbms_output.put_line(' *============================================*/');

  end get_arguments;

  --获取参数

  PROCEDURE pf_get_arguments(p_pkg_name in VARCHAR2,

                            p_obj_name in VARCHAR2) IS

    v_pkg_name varchar2(100) := upper(p_pkg_name);

    v_obj_name varchar2(100) := upper(p_obj_name);

    v_attr    varchar2(100);

    cursor data_cur is

      select t.PACKAGE_NAME,

            t.OBJECT_NAME,

            t.ARGUMENT_NAME,

            t.IN_OUT,

            count(t.ARGUMENT_NAME) over(PARTITION BY t.OBJECT_NAME) arg_number,

            row_number() over(partition by t.OBJECT_NAME order by t.POSITION asc) rank_position

        from sys.user_arguments t

      where t.PACKAGE_NAME = v_pkg_name

        and t.OBJECT_NAME = v_obj_name

        and t.POSITION <> 0;

  begin

    dbms_output.put_line(v_pkg_name || '.' || v_obj_name || '(');

    for rec in data_cur loop

      if rec.in_out = 'IN' then

        v_attr := '';

      elsif rec.in_out = 'OUT' then

        v_attr := '';

      elsif rec.in_out = 'IN/OUT' then

        v_attr := '';

      end if;

      if data_cur%ROWCOUNT = rec.arg_number then

        dbms_output.put_line(lower(rec.ARGUMENT_NAME) || '        =>' ||

                            '  ' || v_attr || lower(rec.ARGUMENT_NAME));

      else

        dbms_output.put_line(lower(rec.ARGUMENT_NAME) || '        =>' ||

                            '  ' || v_attr || lower(rec.ARGUMENT_NAME) || ',');

      end if;

    end loop;

    dbms_output.put_line(');');

  end pf_get_arguments;

end SF_GET_ARGUMENTS_PKG;

/

❺ oracle 存储过程 包

表名:test
字段名:id
序列名称:TEST_ID
create or replace package TEST as
begin ;
procudre insertdate() ;
function getSum() return number;
function getAve() return number;
end TEST ;

create or replace package body TEST as
begin ;
procudre insertdate() is
begin
for (i=1;i<=3:i++}
loop
insert into TEST (ID) values (TEST_ID.nextval) ;
end loop ;
exception
when others
null ;
end insertdate;
function getSum() return number is
v_return number ;
begin
select sum(id) intov_return from TEST ;
rerturn v_return;
end ;
function getAve() return number is
v_return number ;
begin
select AVG(id) into v_return from TEST ;
rerturn v_return;
end ;
end TEST ;

❻ oracle的存储过程和包有什么区别,分别在什么情况下使用啊

包包含于过程,这个东西就好比包是一个文件夹,而过程和视图,函数啊什么的都是里面的文件。要是在什么情况下使用的饥行袭话还真是因人而意,如果包带迅里面有过程的话,直接包名烂兄.过程名就可以使用了!

❼ 如何调用ORACLE程序包中的存储过程

pl/sql里,select
语句必须接into
,不接into那就得返回一个游标出去,比如
create
or
replace
package
test_package
is
procere
query_test(num
number,po_cursor
out
sys_refcursor);
end
test_package;
create
or
replace
package
body
test_package
is
procere
query_test(num
number,po_cursor
out
sys_refcursor)
is
begin

select
unitname,tradetype,workernumber

from
test

where
income=num;
end
query_test;
end
test_package;

❽ oracle中怎么在存储过程中调用同一个包的其他存储过程

在存储过程或函数里调用oracle包的话,首先要有执行这个包的权限;如果包属于其他的用户(不是系统包),调用时:用户名.包名.存储过程(参数)名或者
变量:=用户名.包名.函数(参数);因为函数有返回值,变量类型要跟函数返回值的类型一致。
在command
下调用的话:exec
用户名.包名.存储过程名(参数);select
用户名.包名.函数名(参数)
from
al;就可以了。包属于当期用户可以不写用户名。

❾ oracle 如何在包里创建一个简单的函数和存储过程

25、包
(1)定义包头
语法:
CREATE [OR REPLACE] PACKAGE [schame_name.]<包名>
IS | AS
包描述

包描述:可以是变量、常量及数据类型定义和游标定义,也可以是存储过程、函数定义和参数列表返回值类型。
例掘岩:
CREATE OR REPLACE PACKAGE employeePackage
AS
--类型定义
Type empRecType is record(
Empno number(4),
Salary number
)

--变量定义
p1 varchar2(20);
type t_departmentNo table is table of dept.deptno%type
index by binary_integer;

--游标定义
Cursor order_sal retrurn EmpRecType;

--聘用员工过程
Procere HireEmployee(p_EmpNo emp.empno%type);

End employeePackage;
例:
CREATE OR REPLACE PACKAGE scott.pkg_displayproct
IS
procere prc_getproctinfo
(
pid scott.proct.prodid%type,
pname out scott.proct.prodname%type,
ctname out scott.proct.CATEGORYID%type,
dscp out scott.proct.description%type
);
function fun_getstock
(
pid scott.proct.prodid%type
)
return number;
END pkg_displayproct;
(2)定义包体
语法:
CREATE OR REPLACE PACKAGE BODY [schame_name.]<包名>
IS | AS
包体描述;
END 包名;

包名:将要创建的包名称,该名称可以和包头所在的包名相同,也可以不同。
包体描述:游标、存储过程或者函数的定义
包体是可选的,如果在明数包头中没有声明任何存储过程或者激散首函数,则包体就不存在,即使在包头有变量、游标或者类型的声明
(3)引用包中对象
BEGIN
[schame_name.][包名.]对象名;
END;

❿ oracle包,存储过程,游标

在你的 scott_emp_sppro3这个procere中, 只要执行open cursor那条语句就可以了, 不能在该procere执行fetch cursor中记录的语句. 因为你在procere中都已经将cursor中的记录用fetch语句获取完了, 那么该procere输出的ref cursor的当前位置就指到cursor的最歼歼后纯改正, 在procere之外当然查询不到该cursor中应该有的结做悔果.

热点内容
linux进程的退出 发布:2025-02-09 03:00:22 浏览:813
淘宝上传时间 发布:2025-02-09 02:42:13 浏览:637
ios缓存数据 发布:2025-02-09 02:32:06 浏览:253
苹果手机如何存储word 发布:2025-02-09 02:23:02 浏览:780
安卓手机如何有苹果的emoji 发布:2025-02-09 02:11:02 浏览:808
编译原理已知语言求文法习题 发布:2025-02-09 02:05:15 浏览:132
中国首个具有世界影响力的编译器 发布:2025-02-09 01:56:21 浏览:720
tomcat上传超时 发布:2025-02-09 01:41:42 浏览:484
androidactivity竖屏 发布:2025-02-09 01:41:40 浏览:378
家庭配置怎么合理 发布:2025-02-09 01:36:14 浏览:808