1. 程式人生 > >oracle動態sql以及繫結變數

oracle動態sql以及繫結變數

        實現動態SQL有兩種方式:DBMS_SQL和本地動態SQL(EXECUTE IMMEIDATE) 。
oracle從8代開始就提供了新的執行動態sql的功能:execute immeidate v_sql using *** into ***;
本地動態SQL
  EXECUTE IMMEDIATE ‘語句’
  [INTO {變數1, 變數2, … 變數N | 記錄體}]
  [USING [IN | OUT | IN OUT] 繫結變數1, … 繫結變數N]
  [{RETURNING | RETURN} INTO 輸出1 [, …, 輸出N]…];
  注意本地動態SQL僅支援弱型別REF CURSOR,即對於REF CURSOR,不支援BULK COLLECT.
動態SQL的使用:1、執行dml語句,在pl/sql中不能直接執行dml語句;2、執行的語句是在程式執行前不可估計的,就比如在執行時該sql才會被按照不同的條件進行拼接等。
該方法引用動態SQL的最大缺憾就是返回的結果集最多隻能有一行,即使是ref cursor也只能包含一行的結果集。但是可以使用臨時表的方法,把結果集儲存起來,動態SQL執行完畢後再取資料就可以了。也就是說,這個動態SQL可以是一個塊,裡面的語句可以足夠複雜,只要寫作者認為自己有能力除錯。
說到除錯,也是動態SQL的一個很大的缺憾吧,在pl/sql中,一個varchar2的長度超過一定的大小後就自動轉化為 long value,無法列印,無法檢視,至少對於目前的我的能力,還沒有找到方法,即使使用substr的方法來分解串再列印的方法都會失敗。
繫結變數:動態SQL的形成一般使用的拼串和榜定變數兩種方法,而普遍認為繫結變數有利於提高效率,其效率甚至與拼串的方式不可同日而語,這是可以理解的,繫結變數的使用,可以在多次執行sql時只使用一次語句分析、優化,而拼接則被認為是每次執行的sql都是不同的,每次執行都需要重新分析、優化,這往往是sql執行中最費時的操作。
動態sql高深莫測,如同指標一樣,但為什麼要使用那麼晦澀的語法呢,除非不得已。

本文轉自
http://hi.baidu.com/programcg/blog/item/7def5f02c3bcd20a4bfb515c.html

相關推薦

oracle動態sql以及變數

        實現動態SQL有兩種方式:DBMS_SQL和本地動態SQL(EXECUTE IMMEIDATE) 。 oracle從8代開始就提供了新的執行動態sql的功能:execute immeidate v_sql using *** into ***; 本地動態

動態SQL變數

說動態SQL之前先來說下靜態SQL 靜態SQL語句 語句中主變數的個數與資料型別在預編譯時都是確定的,我們稱這類嵌入式SQL語句為靜態SQL語句。 與之相對應的就是動態SQL 動態SQL方法允許在程式執行過程中臨時“組裝”SQL語句。 那麼他們之

檢視oracle中未使用變數sql語句

資料庫版本:11.2.0.4 查詢語句: with force_mathces as (select l.force_matching_signature mathces, max(l.sql_id || l.child_number) max_sql_

oracle動態SQL集合變數

有如下需求,在儲存過程中,傳遞的引數是字串,字串格式是‘1,2,3 ’, 由數字組成,中間用','號分割;然後在SQL語句如下使用: create or replace procedure moveToRight (v_ids varchar2, v_workid int ) as i_sql varc

Oracle SQL調優之變數用法簡介

最近在看《基於Oracle的SQL優化一書》,並做了筆記,作者的個人部落格:[http://www.dbsnake.net/](http://www.dbsnake.net/) @[toc] ## 一、SQL執行過程簡介 繼上一篇部落格Oracle的cursor學習筆記:[Oracle的遊標Cursor原理

SQL Profiles的force_match引數在不改變程式碼的情況下解決沒有使用變數的問題

How To Use SQL Profiles for Queries Using Different Literals Using the Force_Match Parameter of DBMS_SQLTUNE.ACCEPT_SQL_PROFILE (Doc ID 1253696.1)

mybatis批量分批次插入oracle資料庫,報ORA-01745: 無效的主機/變數名...

方法一:迴圈呼叫插入單條記錄的方法,效率真心讓人捉急 (3萬條資料,快三分鐘)     public int saveGwghidlist1(List<Gwghid> list) {                  int xh=0;         dele

angular/ionic中對img、iframe等的src進行動態變數的問題解決

例如以下程式碼: 對應的html頁面中是這樣:<iframe class=“filling” [src] = “iframe”> 在這裡直接對src進行動態繫結變數就會出現:unsafe value used in a resource URL co

Oracle 變數窺探

Bind Peeking是Oracle 9i中引入的新特性,一直持續到Oracle 10g R2。它的作用就是在SQL語句硬分析的時候,檢視一下當前SQL謂詞的值 ,以便生成最佳的執行計劃。而在oracle 9i之前的版本中,Oracle 只根據統計資訊來做出執行計劃。

關於變數關閉的情況,Oracle是如何工作的?

關於如果繫結變數窺探被關閉了,oracle 會怎麼處理的呢?是每次都硬解析還是這樣處理? 首先介紹下繫結變數窺探: 使用SQL首次執行時的值來生成執行計劃。後續再次執行該SQL語句則使用首次執行計劃來執行。 測試版本:Oracle 12.1.0.2

oracle筆記--case的使用和變數

oracle裡的case功能非常強大, 簡單的用法: select  CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女' ELSE '其他' END from student; 還沒有當做預處理去使用 select

ORACLE 變數用法總結

之前對ORACLE中的變數一直沒個太清楚的認識,比如說使用:、&、&&、DEIFINE、VARIABLE……等等。今天正好閒下來,上網搜了搜相關的文章,彙總了一下,貼在這裡,方便學習。 ================================

oracle開發過程中儘量使用變數

在儲存過程或者java程式使用sql的過程中,儘量使用繫結變數。否則硬解析太多,比較拖效能。 下面查詢只是空格多了幾個。 SQL> select * from ml_1234 where a

動態建立一組按鈕,併為其變數引數事件方法

做專案時,遇到一個比較奇怪的需求,需要用highChart作圖,但是由於橫座標是公司的部分職級的人員,且人員數目較多,這樣就會造成作出來的圖好長, 在有限的螢幕上顯示不全。於是客戶要求,可以將所有人員根

oracle變數使用方法總結

在Oracle中,對於一個提交的sql語句,存在兩種可選的解析過程,硬解析和軟解析。 一個硬解析需要經解析,制定執行路徑,優化訪問計劃等步驟。硬解析不僅僅會耗費大量的cpu,更重要的是會佔據重要的閂(latch)資源。唯一使得oracle能夠重複利用執行計劃的方法就是採用繫

MySQL-SQL變數

認識繫結變數 繫結變數是為了減少解析的,比如你有個語句這樣 select aaa,bbb from ccc where ddd=eee; 如果經常通過改變eee這個謂詞賦值來查詢,像如下 select aaa,bbb from ccc where

ibatis 變數 sql硬軟解析

關於避免sql的硬解析:1.ibatis中,所有的 ##都是繫結變數,所有的$$都不算繫結變數,所以儘量避免使用$$。 但是對於In,$$中傳入的值,不被看成一個整體,此在In條件中可以順利使用只是不是繫結變數如:1 :2 :3 :4這種語句; 如果in的值是##傳入的,則

oracle 變數,索引優缺點

繫結變數 優點: 可以在library cache中共享遊標,避免硬解析以及與之相關的額外開銷 在大批量資料操作時將呈數量級來減少閂鎖的使用,避免閂鎖的競爭 缺點: 繫結變數被使用時,查詢優化器會忽略其具體

java動態/靜態以及雙分派

動態繫結:程式在執行期間而不是在編譯期間,根據所引用物件的實際型別呼叫對應的方法,重寫以及介面的實現都屬於該範疇,使用實際的物件資訊來完成API的呼叫 public class DynamicBind { public static void main(Str

oracle變數的使用

不使用繫結變數而使用硬編碼是oracle效能問題的主要原因和可伸縮性的主要障礙而且這種障礙是除了使用繫結變數以外很難改變的!下面根據一個簡單的試驗來檢視硬編碼與使用繫結變數對效能的影響:在一個查詢中我們可以使用兩種方式:比如查詢個人編號:select * from ac01