1. 程式人生 > >mysql儲存過程執行動態sql語句並返回值

mysql儲存過程執行動態sql語句並返回值

Java程式碼
set @sql=’xxx’;
prepare stmt from @sql;
execute stmt;
deallocate prepare stmt;
select @curd1;

set @sql=’xxx’;
prepare stmt from @sql;
execute stmt;
deallocate prepare stmt;
select @curd1;

1、在prepare stmt from 命令後面的變數不能是自定義變數,必須是使用者變數或者全域性變數
2、儲存動態SQL的值的變數也不能是自定義變數,必須是使用者變數或者全域性變數
例子:
set @sql=’select cur,cur2 into @curd1,curd2 from mytable’
prepare stmt from @sql;

3、儲存過程非執行緒安全的,由於在動態SQL中使用使用者變數,在多執行緒環境下,這個變數會被多個執行緒共享,因此必須加鎖,方法如下:

declare lockstatus int;
if get_lock(‘鎖名稱’,60) then
…..
select release_lock(‘鎖名稱’) into lockstatus;

end if;

get_lock中第一個引數是鎖得名稱,自定義的,當其他執行緒也請求這個鎖時就會被鎖定。
第二個引數是等待時間,即60秒內獲取鎖,否則失敗。

release_lock只接受 鎖名稱

release_lock不能單獨使用,如
release_lock(‘lock1′);
會編譯不同步
必須在語句中使用,如select release_lock(‘lock1′) into lockstatus;
比較怪異。
估計get_lock也是,但沒試驗。

4、JAVA程式呼叫方法(hibernate)
String sqlname = “call 儲存過程名稱(?..引數列表)”;
Query query = null;
query = session.createSQLQuery(sqlname);
query.setParameter(1,..);

List list = query.list();
list.get(0); //這個就是儲存過程中的select @curd1; 的查詢結果


相關推薦

mysql儲存過程執行動態sql語句返回

Java程式碼 set @sql=’xxx’; prepare stmt from @sql; execute stmt; deallocate prepare stmt; select @curd1; set @sql=’xxx’; prepare stmt f

mysql儲存過程動態SQL內獲取返回

MySql通用分頁儲存過程 過程引數 p_cloumns varchar(500),p_tables varchar(100),p_where varchar(4000),p_order varchar(100),p_pageindex int,p_pagesize int

mysql儲存過程動態SQL內獲取返回

DROPPROCEDUREIFEXISTS stat_cube.sp_get_end_date;CREATEPROCEDURE stat_cube.`sp_get_end_date`( p_sp_name varchar(50), out p_ret_date date )BEGINdeclare src_1

mysql 儲存過程 執行動態sql

使用mysql的儲存過程執行動態sql語句 delimiter // create procedure proce2(in old varchar(100), in newT varchar(1

mybaits(查詢與別名、日誌框架顯示sql語句、物件屬性和資料庫表字段不匹配resultMap使用、mysql資料查詢分頁、執行sql儲存過程動態SQL語句

主要是各種配置檔案,建議把整個專案搬到自己電腦上慢慢看。 建立maven專案 首先是各種配置檔案: pom.xml: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://m

mysql儲存過程接收動態sql返回

一、今天需要用到mysql儲存過程接受動態sql的返回值,特此做以下記錄 二、具體如下 -- BS追加公能欄位 獲取型別和公能分組ID declare vPartName,vType,vSql,vId varchar(100); declare vPartGroupId i

MySQL儲存過程實現動態執行SQL

  create procedure p_procedurecode(in sumdate varchar(10)) begin      declare v_sql varchar(500);    #需要

儲存過程執行動態Sql語句

  MSSQL為我們提供了兩種動態執行SQL語句的命令,分別是EXEC和sp_executesql;通常,sp_executesql則更具有優勢,它提供了輸入輸出介面,而EXEC沒有。還有一個最大的好處就是利用sp_executesql,能夠重用執行計劃,這就大大提供了執

MYSQL儲存過程執行用字串拼成的sql語句

執行的sql必須定義為 @sql  才能執行  否則報錯DROP PROCEDURE IF EXISTS  test_prepareStam;    delimiter // CREATE PROCE

oracle儲存過程中如何執行動態SQL語句

有時需要在oracle儲存過程中執行動態SQL語句 ,例如表名是動態的,或欄位是動態的,或查詢命令是動態的,可用下面的方法: set serveroutput ondeclare    n number;    sql_stmt varchar2(50);    t varc

存儲過程執行動態Sql語句

查詢 需要 一點 定義 data 復制 ast 我們 臨時   在最近的項目中,有用到動態執行sql語句,SQL為我們提供了兩種動態執行SQL語句的命令,分別是EXEC和sp_executesql;通常,sp_executesql則更具有優勢,它提供了輸入輸出接口,而EXE

怎樣SQL存儲過程執行動態SQL語句

緩存 參數 insert 每次 一點 證明 record scac 清空緩存 MSSQL為我們提供了兩種動態執行SQL語句的命令,分別是EXEC和sp_executesql;通常,sp_executesql則更具有優勢,它提供了輸入輸出接口,而EXEC沒有。還有一個最大的好

db2怎樣將儲存過程當中的SQL語句打印出來?

 1)首先需要建立一個OUT 引數 例如:OUT T VARCHAR(10000)       2)其次需要在prepare s1 from v_sql1;之前設定set t = v_sql1;(首次,以後set t = t||v_sql1;)       3)而後執行cal

MySQL檢視實時執行SQL語句

MySQL預設不能實時檢視執行的SQL語句,因為這會消耗一定的資源。要開啟這個功能,稍微配置一下,開啟這個LOG記錄就可以了。1 檢視LOG功能首先,檢視是否已經開啟實時SQL語句記錄。mysql> SHOW VARIABLES LIKE "general_log%";

MySQL儲存過程動態行轉列

轉載:http://segmentfault.com/a/1190000004314724?ref=myread MySQL儲存過程中使用動態行轉列 最近做專案關於資料報表處理,然而資料庫儲存格式和報表展現形式不同,需要進行一下行轉列的操作,在做上一個專案的時候也看

關於mysql儲存過程建立動態表名及引數處理

轉載請註明出處:簾卷西風的專欄(http://blog.csdn.net/ljxfblog) 最近遊戲開始第二次內測,開始處理操作日誌,最開始把日誌放到同一個表裡面,發現一天時間,平均100玩家線上,操作記錄就超過13萬條,決定拆表,按照日期來儲存日誌,每天的日誌存到一個表裡

Java下拼接執行動態SQL語句

  在實際業務中經常需要拼接動態SQL來完成複雜資料計算,網上各類技術論壇都有討論,比如下面這些問題:   拼接動態SQL的一般做法有:   1、使用動態語句   很多資料庫都提供了處理動態SQL的語法,如Oracle的EXECUTE IMMEDIATE語

用sp_executesql執行動態SQL語句及獲得返回

過去我執行拼湊出來的動態SQL語句,都直接使用EXEC @sql 的方式。有好幾次,都看到有資料說,應該儘量使用 sp_executesql。究其原因,是因為僅僅引數不同的情況下,sp_executesql可以重用執行計劃,這不就有跟儲存過程一樣的優勢了嗎?同時,sp_exe

儲存過程動態sql、for、if

create or replace procedure ---- is COLLECTDATE varchar2(8) := to_char(sysdate-1,'yyyymmdd'); -- 統計日期 yyyymmdd INIT_STAT

為什麼在mysql資料庫可以執行SQL語句,在java裡卻報錯!!

一,解決方法 為儘快解決問題, 其他程式碼省略,直接說明解決辦 String sql = "select * from tablename"; //引發java虛擬機器報錯