oracle存儲過程行數
⑴ 如何用Oracle存儲過程實現返回多行記錄
Oracle 存儲過程可以返回一個查詢,一個查詢一般是沒有行數限制的。
⑵ java獲得oracle存儲過程更新操作的影響行數
其實二樓寫的最簡單,但對於新手,最好別那麼寫,至於1樓,如果數據不是很多,沒必要搞個游標。你也可以看看我寫的 create or replace procere P_Update(o_vc_message out varchar2) is type column1 is table of table1.column1%type index by binary_integer; col1s column1; type rid is table of rowid index by binary_integer; rids rid; temp table1.column1%type; begin select column1,rowid bulk collect into col1s,rids from table1; if (column1.count != 0) then for i in col1s.first..col1s.last loop temp := col1s(i);--處理 col1s(i) 想幹嘛幹嘛 update table1 set column1 = temp where rowid = rids(i); end loop; end if; o_vc_message := 'OK!'; exception when others then o_vc_message := 'exception happend.' || sqlcode || sqlerrm; rollback; return; end P_Update; 如果僅僅是簡單處理column1,比如加1什麼的,就別搞那麼復雜,一個sql就ok了。
⑶ oracle存儲過程實際返回行數
oracle存儲過程實際返回行數
CREATE OR REPLACE PROCEDURE OPE_SELECT (
loginname_i in TBL_OPERATEINFO.loginname%type,
ref_cursor out sys_refcursor
) AS
BEGIN
open ref_cursor for
SELECT name FROM TBL_OPERATEINFO WHERE loginname LIKE '%' || loginname_i || '%' ;
END OPE_SELECT;
⑷ Oracle資料庫的存儲過程怎麼寫
1 CREATE OR REPLACE PROCEDURE 存儲過程名
2 IS
3 BEGIN
4 NULL;
5 END;
行1:
CREATE OR REPLACE PROCEDURE 是一個SQL語句通知Oracle資料庫去創建一個叫做skeleton存儲過程, 如果存在就覆蓋它;
行2:
IS關鍵詞表明後面將跟隨一個PL/SQL體。
行3:
BEGIN關鍵詞表明PL/SQL體的開始。
行4:
NULL PL/SQL語句表明什麼事都不做,這句不能刪去,因為PL/SQL體中至少需要有一句;
行5:
END關鍵詞表明PL/SQL體的結束.
存儲過程創建語法:
create or replace procere 存儲過程名(param1 in type,param2 out type)
as
變數1 類型(值范圍); --vs_msgVARCHAR2(4000);
變數2 類型(值范圍);
Begin
Select count(*) into 變數1 from 表A where列名=param1;
If (判斷條件) then
Select 列名 into 變數2 from 表A where列名=param1;
Dbms_output。Put_line(『列印信息』);
Elsif (判斷條件) then
Dbms_output。Put_line(『列印信息』);
Else
Raise 異常名(NO_DATA_FOUND);
End if;
Exception
When others then
Rollback;
End;
⑸ oracle存儲過程中,怎樣獲取表一行數據的累計值,而且是動態的.
declare
v_result number(20);
v_now_month varchar2(100);
begin
--獲取當前系統時間的 月份
v_now_month := to_char(sysdate,'mm');
--通過FOR循環來獲取每一行的每個欄位
for row in (select * from table) loop
--具體裡面的循環到幾月份自己想方法限制吧
v_result := row.1月收入 + row.2月收入 + row.3月收入;
end loop;
dbms_output.put_line(v_result); --列印結果
end ;
**如果是動態的,那就在FOR循環裡面用 動態拼接SQL的方式
⑹ SQLhelper 執行 Oracle 的存儲過程,如何返刪除的行數請給出簡單可行的例子 。
public override int DeleteUser(string userID)
{
OracleParameter[] para =new OracleParameter[2];
para[0] = new SqlParameter(":userID", OracleDbType.VARCHAR2) { Value = userID };
para[1] = new SqlParameter(":rowCnt", OracleDbType.Number) { Direction = ParameterDirection.Output };
// 調用有參數的存儲過程
sqlHelper.ExecuteNonQuery(ConnectionString, GetFullyQualifiedName("Userdelete"), para);
return (int)para[1].Value;
}
//////////////////////////////////////////////
CREATE OR REPLACE PROCEDURE Userdelete
(
userID IN VARCHAR2,
rowCnt out number
)
IS
BEGIN
DELETE FROM USERM WHERE userID = 'S001';
select sql%rowcount into rowcnt from al;
END;
Oracle有個隱式參數:sql%rowcount
用於記錄受影響的行數
給存儲過程設置一個output的參數
在刪除語句後面用:
select sql%rowcount into 參數 from al
⑺ oracle的存儲過程
1.存儲過程可以使得程序執行效率更高、安全性更好,因為過程建立之後 已經編譯並且儲存到資料庫,直接寫sql就需要先分析再執行因此過程效率更高,直接寫sql語句會帶來安全性問題,如:sql注入
2.建立過程不會很耗系統資源,因為過程只是在調用才執行。
3.存儲過程可以用於降低網路流量,存儲過程代碼直接存儲於資料庫中,所以不會產生大量T-sql語句的代碼流量。
4.使用存儲過程使您能夠增強對執行計劃的重復使用,由此可以通過使用遠程過程調用 (RPC) 處理伺服器上的存儲過程而提高性能。RPC 封裝參數和調用伺服器端過程的方式使引擎能夠輕松地找到匹配的執行計劃,並只需插入更新的參數值。
5.可維護性高,更新存儲過程通常比更改、測試以及重新部署程序集需要較少的時間和精力。
6.代碼精簡一致,一個存儲過程可以用於應用程序代碼的不同位置。
7.增強安全性:
a、通過向用戶授予對存儲過程(而不是基於表)的訪問許可權,它們可以提供對特定數據的訪問;
b、提高代碼安全,防止 SQL注入(但未徹底解決,例如,將數據操作語言--DML,附加到輸入參數);
c、SqlParameter 類指定存儲過程參數的數據類型,作為深層次防禦性策略的一部分,可以驗證用戶提供的值類型(但也不是萬無一失,還是應該傳遞至資料庫前得到附加驗證)。
缺點就是:
1、大量的利用過程,會對伺服器壓力比較大。
⑻ oracle 存儲過程 實際返回的行數超出請求的行數
定義一個數據類型是游標
然後返回這個數據類型的參數就可以了
⑼ Java連接Oracle調用存儲過程提示實際返回的行數超出請求的行數異常,怎麼解決
package com.yc.ycportal.ge.util;import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;import com.mysql.jdbc.ResultSet;public class TestOracle { private Connection conn=null;
private CallableStatement call=null;
private ResultSet rs=null; public TestOracle() {
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
setConn();
}
catch (ClassNotFoundException ex) {
}
} public void setConn(){
String url="jdbc:oracle:thin:@localhost:1521:hy";
try {
conn = DriverManager.getConnection(url, "system", "manager");
System.out.println("conn ok");
}
catch (SQLException ex) {
}
} public void closeConn(){
if(conn!=null){
try {
conn.close();
System.out.println("conn close");
}
catch (SQLException ex) {
}
}
} //調用單獨的具有輸出參數的過程
public void testShuchu(int salary ){
//實例化cal
try {
//cal = conn.prepareCall("{call hr.shuchu(?,?)}");
call=conn.prepareCall("begin hr.shuchu(?,?); end;");
call.setInt(1,salary);
//注冊輸出參數
//cal.registerOutParameter(2,java.sql.Types.VARCHAR);
call.registerOutParameter(2,oracle.jdbc.OracleTypes.VARCHAR);
call.execute();
//獲得輸出參數
// String str=cal.getString(2);
String str=(String)call.getObject(2);
System.out.println(str);
}
catch (SQLException ex) {
}
finally{
try {
call.close();
}
catch (SQLException ex1) {
}
} }// 調用函數
public void testHanshu(int num1,int num2){
try {
call = conn.prepareCall("begin ?:=hr.mypack.myfunc(?,?); end;");
call.setInt(2,num1);
call.setInt(3,num2);
call.registerOutParameter(1,oracle.jdbc.OracleTypes.NUMBER);
call.execute();
int num = call.getInt(1);
System.out.println(num);
}
catch (SQLException ex) {
}
finally{
try {
call.close();
}
catch (SQLException ex1) {
}
} }// 調用游標
public void testRs(int salary){
try {
call = conn.prepareCall("begin hr.mypack.shuchu(?,?); end;");
call.setInt(1,salary);
call.registerOutParameter(2,oracle.jdbc.OracleTypes.CURSOR);
call.execute();
rs=(ResultSet)call.getObject(2); if(rs!=null){
while (rs.next()) {
System.out.println(rs.getString(2));
}
}
else{
System.out.println("查無結果");
}
}
catch (SQLException ex) {
}
finally{
try {
rs.close();
call.close();
}
catch (SQLException ex1) {
} }
}
public static void main(String[] args) {
TestOracle dbUtil1 = new TestOracle();
dbUtil1.testRs(420);
}}package com.yc.ycportal.ge.util;import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;import com.mysql.jdbc.ResultSet;public class TestOracle { private Connection conn=null;
private CallableStatement call=null;
private ResultSet rs=null; public TestOracle() {
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
setConn();
}
catch (ClassNotFoundException ex) {
}
} public void setConn(){
String url="jdbc:oracle:thin:@localhost:1521:hy";
try {
conn = DriverManager.getConnection(url, "system", "manager");
System.out.println("conn ok");
}
catch (SQLException ex) {
}
} public void closeConn(){
if(conn!=null){
try {
conn.close();
System.out.println("conn close");
}
catch (SQLException ex) {
}
}
} //調用單獨的具有輸出參數的過程
public void testShuchu(int salary ){
//實例化cal
try {
//cal = conn.prepareCall("{call hr.shuchu(?,?)}");
call=conn.prepareCall("begin hr.shuchu(?,?); end;");
call.setInt(1,salary);
//注冊輸出參數
//cal.registerOutParameter(2,java.sql.Types.VARCHAR);
call.registerOutParameter(2,oracle.jdbc.OracleTypes.VARCHAR);
call.execute();
//獲得輸出參數
// String str=cal.getString(2);
String str=(String)call.getObject(2);
System.out.println(str);
}
catch (SQLException ex) {
}
finally{
try {
call.close();
}
catch (SQLException ex1) {
}
} }// 調用函數
public void testHanshu(int num1,int num2){
try {
call = conn.prepareCall("begin ?:=hr.mypack.myfunc(?,?); end;");
call.setInt(2,num1);
call.setInt(3,num2);
call.registerOutParameter(1,oracle.jdbc.OracleTypes.NUMBER);
call.execute();
int num = call.getInt(1);
System.out.println(num);
}
catch (SQLException ex) {
}
finally{
try {
call.close();
}
catch (SQLException ex1) {
}
} }// 調用游標
public void testRs(int salary){
try {
call = conn.prepareCall("begin hr.mypack.shuchu(?,?); end;");
call.setInt(1,salary);
call.registerOutParameter(2,oracle.jdbc.OracleTypes.CURSOR);
call.execute();
rs=(ResultSet)call.getObject(2); if(rs!=null){
while (rs.next()) {
System.out.println(rs.getString(2));
}
}
else{
System.out.println("查無結果");
}
}
catch (SQLException ex) {
}
finally{
try {
rs.close();
call.close();
}
catch (SQLException ex1) {
} }
}
public static void main(String[] args) {
TestOracle dbUtil1 = new TestOracle();
dbUtil1.testRs(420);
}}
⑽ oracle存儲過程的問題
你聲明的變數aa僅能放置一行的一個欄位的數據。
你的reader表中不只一行數據。
試試使用游標如下:
for cur in (select reader_id from reader)
loop
dbms_output.put_line(cur.reader_id );
end loop;