oracle包與存儲過程
❶ 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中應該有的結做悔果.