ORACLE獲取SQL綁定變數值的方法總結

来源:http://www.cnblogs.com/kerrycode/archive/2017/09/04/7476443.html
-Advertisement-
Play Games

本文總結一下ORACLE資料庫中如何獲取SQL綁定變數值的方法,在SQL優化調優過程中,經常會用到這方面的知識點。在此梳理、總結一下,方面日後查找、翻閱。 方法1:查詢V$SQL V$SQL視圖中的BIND_DATA欄位用來存儲綁定變數的值,但是從這個視圖查詢綁定變數的值,有很大的局限性: 1: 它... ...


 

本文總結一下ORACLE資料庫中如何獲取SQL綁定變數值的方法,在SQL優化調優過程中,經常會用到這方面的知識點。在此梳理、總結一下,方面日後查找、翻閱。

 

 

方法1:查詢V$SQL

 

V$SQL視圖中的BIND_DATA欄位用來存儲綁定變數的值,但是從這個視圖查詢綁定變數的值,有很大的局限性:

 

    1: 它的記錄頻率受_cursor_bind_capture_interval隱含參數控制,預設值為900,表示每900秒記錄一次綁定值,也就是說在900內,綁定變數值的改變不會反應在這個視圖中。除非你調整隱含參數_cursor_bind_capture_interval

    2: 它記錄的僅僅最後一次捕獲的綁定變數值。

    3 BIND_DATA數據類型為RAW,需要進行轉換。

 

可以使用下麵兩種方式來查看綁定變數的值。

COL SQL_ID FOR A14;
COL SQL_TEXT FOR A32;
COL HASH_VALUE FOR 99999999999;
COL BIND_DATA FOR A32;
SELECT SQL_ID          
      ,SQL_TEXT
      ,LITERAL_HASH_VALUE
      ,HASH_VALUE
      ,DBMS_SQLTUNE.EXTRACT_BINDS(BIND_DATA) BIND_DATA
FROM V$SQL
WHERE SQL_TEXT LIKE ''SELECT * FROM TEST%';
 
 
COL SQL_ID FOR A14;
COL SQL_TEXT FOR A32;
COL HASH_VALUE FOR 99999999999;
COL BIND_DATA FOR A32;
SELECT SQL_ID          
      ,SQL_TEXT
      ,LITERAL_HASH_VALUE
      ,HASH_VALUE
      ,DBMS_SQLTUNE.EXTRACT_BIND(BIND_DATA,1).VALUE_STRING BIND_DATA
FROM V$SQL
WHERE SQL_TEXT LIKE 'SELECT * FROM TEST%';

 

如下實驗所示,我們在一個會話中使用綁定變數的查詢SQL語句,然後,我們來嘗試獲取綁定變數的值,如下所示:

 

 

SQL> SHOW USER;
USER is "TEST"
SQL> DESC TEST;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID                                                 NUMBER(10)
 NAME                                               VARCHAR2(32)
 
SQL> 
SQL> VARIABLE NAME NVARCHAR2(32);
SQL> EXEC :NAME :='KKKK';
 
PL/SQL procedure successfully completed.
 
SQL> SELECT * FROM TEST WHERE NAME=:NAME;
 
no rows selected
 
SQL> 
 
 
 
SQL>SHOW USER;
USER is "SYS"
SQL> COL SQL_ID FOR A14;
SQL> COL SQL_TEXT FOR A32;
SQL> COL HASH_VALUE FOR 99999999999;
SQL> COL BIND_DATA FOR A32;
SQL> SELECT SQL_ID          
  2        ,SQL_TEXT
  3        ,LITERAL_HASH_VALUE
  4        ,HASH_VALUE
  5        ,DBMS_SQLTUNE.EXTRACT_BINDS(BIND_DATA) BIND_DATA
  6  FROM V$SQL
  7  WHERE SQL_TEXT LIKE 'SELECT * FROM TEST%';
 
SQL_ID         SQL_TEXT                         LITERAL_HASH_VALUE   HASH_VALUE BIND_DATA(NAME, POSITION, DUP_PO
-------------- -------------------------------- ------------------ ------------ --------------------------------
0r7m5jyz9ng09  SELECT * FROM TEST WHERE NAME=:N                  0   3197778953 SQL_BIND_SET(SQL_BIND(NULL, 1, N
               AME                                                              ULL, 1, 'NVARCHAR2(128)', 2000,
                                                                                NULL, NULL, 128, '04-SEP-17', 'K
                                                                                KKK', ANYDATA()))
 
 
SQL> COL SQL_ID FOR A14;
SQL> COL SQL_TEXT FOR A32;
SQL> COL HASH_VALUE FOR 99999999999;
SQL> COL BIND_DATA FOR A32;
SQL> SELECT SQL_ID          
  2        ,SQL_TEXT
  3        ,LITERAL_HASH_VALUE
  4        ,HASH_VALUE
  5        ,DBMS_SQLTUNE.EXTRACT_BIND(BIND_DATA,1).VALUE_STRING BIND_DATA
  6  FROM V$SQL
  7  WHERE SQL_TEXT LIKE 'SELECT * FROM TEST%';
 
SQL_ID         SQL_TEXT                         LITERAL_HASH_VALUE   HASH_VALUE BIND_DATA
-------------- -------------------------------- ------------------ ------------ --------------------------------
0r7m5jyz9ng09  SELECT * FROM TEST WHERE NAME=:N                  0   3197778953 KKKK

 

clip_image001

 

 

 

如果此時你給變數NAME賦值為kerry,然後你使用上面SQL語句查詢,你會發現綁定變數的值依然為"KKKK",這個是因為綁定變數何時被捕獲是有一定規律的:

 

1 含有綁定變數的sql語句被硬解析時

 

2 當含有綁定變數的sql語句以軟解析或者軟軟解析方式重覆執行時,該SQL語句中的綁定變數的具體輸入值也可能被ORACLE捕獲,只不過預設情況下這種捕獲操作

受隱含參數_cursor_bind_capture_interval影響,預設需要間隔15900秒)分鐘才會做一次

 

 

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一般情況,在- (void)webViewDidFinishLoad:(UIWebView *) webView方法里添加如下代碼: 這方法有時候會失效! 這方法在沒有改變webview的字體大小的時候還是使用正常的,但是你在改了字體大小或者圖片大小等之後是沒有效果的, webview的高度還是原來 ...
  • USE master; --5.2 字元串函數 --1.計算字元串長度 SELECT LEN('abc'); --2.字元串轉換為小寫 SELECT 'A', LOWER('a'); --3.字元串轉換為大寫 SELECT 'a', UPPER('a'); --4.截去字元串左側空格 SELECT ... ...
  • 轉自: http://www.maomao365.com/?p=4906 <span style="color:white;background-color:blue;font-weight:bold;">一、instead of 觸發器應用一創建只讀視圖的方法</span><span style= ...
  • 結構化查詢語言(SQL)是數據挖掘分析行業不可或缺的一項技能。對於SQL來說,編寫查詢語句只是第一步,確保查詢語句高效並且適合於你的資料庫操作工作,才是最重要的。 ...
  • 觸發器的操作: 1.觸發器的創建: (1).創建包含一條語句的觸發器 create trigger trigger_name before|after trigger_event on table_name for each row trigger_stmt; trigger_event表示操作事件 ...
  • Amazon在SIGMOD 2017發表了論文《Amazon Aurora: DesignConsiderations for High Throughput Cloud-Native Relational Databases》,第一次公開介紹了Aurora的設計理念和內部實現,下文是我對論文的解讀 ...
  • 作者: kent鵬 轉載請註明出處: http://www.cnblogs.com/xieyupeng/p/7476717.html 1.游標(游標)Cursor 在寫java程式中有集合的概念,那麼在pl/sql中也會用到多條記錄,這時候我們就要用到游標,游標可以存儲查詢返回的多條數據。 語法: ...
  • Nuget添加StackExchange.Redis的引用 由於Redis封裝類同時使用了Json,需要添加JSON.NET引用(Newtonsoft.Json) Redis封裝類 /// <summary> /// Redis 操作類 /// </summary> public class Red ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...