動態sql如何預編譯
時需要在oracle 存儲過程中執行動態SQL 語句 ,例如表名是動態的,或欄位是動態的,
或查詢命令是動態的,可用下面的方法:
set serveroutput ondeclaren number;sql_stmt varchar2(50);
t varchar2(20);beginexecute immediate 'alter session set nls_date_format=''YYYYMMDD''';
t := 't_' || sysdate;
sql_stmt := 'select count(*) from ' || t;
execute immediate sql_stmt into n;
dbms_output.put_line('The number of rows of ' || t || ' is ' || n);end;
如果動態SQL 語句 很長很復雜,則可用包裝.
CREATE OR REPLACE PACKAGE test_pkgISTYPE cur_typ IS REF CURSOR;
PROCEDURE test_proc (v_table VARCHAR2,t_cur OUT cur_typ);END;/
CREATE OR REPLACE PACKAGE BODY test_pkgISPROCEDURE test_proc (v_table VARCHAR2,t_cur OUT cur_typ)ISsqlstr VARCHAR2(2000);BEGINsqlstr := 'SELECT * FROM '||v_table;
OPEN t_cur FOR sqlstr;END;END;/
在oracle 中批量導入,導出和刪除表名以某些字元開頭的表
spool c:\a.sql
㈡ 動態表名組裝的sql,還能預編譯嗎
當然可以,就和你正常的一樣
sql = "select sms_mt_send_detail"+day+" detail inner join .... where detail.user_mobile = ? and ...."
PreparedStatement stat = con.prepareStatement(sql);
stat.setString(1,table); -- 設置參數
...
㈢ 在java中如何實現預編譯
/*
* ProCompile.java *預處理要編譯的文件,刪除多餘的空白,注釋,換行,回車等
* Created on 2007年9月18日, 下午8:58 */ package javacompile; import java.io.*;
import java.util.regex.*;
import javax.swing.JOptionPane; /** * @com.junjian.sun public class PerCompile { File f = null;
String fileString = null;
Pattern p = null;
Matcher m = null;
String regex; //正則表達式 //初始化p
public PerCompile() {
regex ="(//.+)" + //(//.+) 對應單行注釋
//"|(/\\*(.+\\n)+\\*/)"+ // 想對應多行注釋... "|(\\r\\n)" + "|(\\n)"+//(\\r\\n)|(\\n)對應換行
"|(\\B\\s+)" ; // 空白符
String ss;
f = new File(new JOptionPane()
.showInputDialog("請輸入文件所在路徑~"));
try {
BufferedReader bf = new BufferedReader(new FileReader(f));
ss = bf.readLine()+"\n";
fileString = ss; //如果沒有這兩句,ss的開頭會有「null」
while((ss = bf.readLine())!= null){
fileString += ss+"\n"; bf.close();
} catch (IOException ex) {
ex.printStackTrace(); p = Pattern.compile(regex);
m = p.matcher(fileString); //執行替換所有多餘空行,空白符,注釋
void Dels(){
System.out.println("before: "+fileString);
if(m.find()) System.out.println("find!!");
System.out.println(m.replaceAll("")); } }
-
㈣ MYSQL如何執行動態過程.
預制語句的SQL語法基於三個SQL語句: PREPARE stmt_name FROM preparable_stmt; EXECUTE stmt_name [USING @var_name [, @var_name] ...]; {DEALLOCATE | DROP} PREPARE stmt_name; PREPARE語句用於預備一個語正辯謹句,並賦予它名稱stmt_name,藉此在以後引用該語句。語句名稱對案例不敏感。preparable_stmt可以是一個文字字元串,也可以是一個包含了語句文本的用戶變數。該文本必須展現一個單一的SQL語句,而不是多個語句。使用本語句,灶孫『?』字元可以被用於製作參數,以指示當您執行查詢時,數據值在哪裡與查詢結合在一起。『?』字元不應加引號,即使您想要把它們與字元串值結合在一起,也不要加引號。參數製作符只能被用於數據值應該出現的地方,不用於SQL關鍵詞和標識符等。 如果帶有此名稱的預制語句已經存在,則在新的語言舉基被預備以前,它會被隱含地解除分配。這意味著,如果新語句包含一個錯誤並且不能被預備,則會返回一個錯誤,並且不存在帶有給定名稱語句。 預制語句的范圍是客戶端會話。在此會話內,語句被創建。其它客戶端看不到它。 在預備了一個語句後,您可使用一個EXECUTE語句(該語句引用了預制語句名稱)來執行它。如果預制語句包含任何參數製造符,則您必須提供一個列舉了用戶變數(其中包含要與參數結合的值)的USING子句。參數值只能有用戶變數提供,USING子句必須准確地指明用戶變數。用戶變數的數目與語句中的參數製造符的數量一樣多。 您可以多次執行一個給定的預制語句,在每次執行前,把不同的變數傳遞給它,或把變數設置為不同的值。 要對一個預制語句解除分配,需使用DEALLOCATE PREPARE語句。嘗試在解除分配後執行一個預制語句會導致錯誤。
㈤ 能執行預編譯sql的是哪一個選項
能執行預編譯sql的是哪一個選項
pstmt.setString(1,user.getId()+"");
pstmt.setString(2,user.getName());
pstmt.setString(3,user.getPwd());
這是以佔位符方式設置 sql的參數值。
㈥ 如何在oracle存儲過程中執行動態sql語句
給你一個案例對這些,使用execute immediate就可以了,存儲過程和語句塊也是一樣的,自己改一改,沒區別的。
語法格式
EXECUTEIMMEDIATEdynamic_string
[INTO{define_variable[,define_variable]...|record}]
[USING[IN|OUT|INOUT]bind_argument[,[IN|OUT|INOUT]bind_argument]...]
[{RETURNING|RETURN}INTObind_argument[,bind_argument]...];
1,操作DDL語句,這也是動態SQL的常用操作之一
如下所示使用動態SQL創建資料庫表:
DECLARE
l_dync_sqlVARCHAR2(100);
BEGIN
l_dync_sql:='CREATETABLEcux_dync_test(idNUMBER,creation_dateDATE)';
EXECUTEIMMEDIATEl_dync_sql;
END;
2,操作DML語句,使用USING子句可以按照順序將輸入的值綁定到變數,如果動態SQL只有單行輸出的話可以直接使用INTO來接收輸出值,如下所示。
DECLARE
l_dync_sqlVARCHAR2(100);
l_person_nameVARCHAR2(140);
l_ageNUMBER;
BEGIN
l_dync_sql:='SELECTperson_name,ageFROMcux_cursor_testWHEREperson_id=:1';
EXECUTEIMMEDIATEl_dync_sql
INTOl_person_name,l_age--使用into語句接手動態SQL的輸出,如果輸出多行則出錯
USING101;--給綁定變數賦值
dbms_output.put_line('PersonName:'||l_person_name);
dbms_output.put_line('Age:'||l_age);
END;