首頁 資料庫 mysql教程 一次丧心病狂的PLS-00306错误分析

一次丧心病狂的PLS-00306错误分析

Jun 07, 2016 pm 04:36 PM
dat 分析 錯誤

在做database replay预处理的时候遇到一个问题,初略的看,是执行包调用内部(函数/存储过程)出现的错误。感觉是一个典型的传参的错误。 SQL exec dbms_workload_replay.PROCESS_CAPTURE('AAA');BEGIN dbms_workload_replay.PROCESS_CAPTURE('AAA'); END; *ER

在做database replay预处理的时候遇到一个问题,初略的看,是执行包调用内部(函数/存储过程)出现的错误。感觉是一个典型的传参的错误。

SQL> exec dbms_workload_replay.PROCESS_CAPTURE('AAA');
BEGIN dbms_workload_replay.PROCESS_CAPTURE('AAA'); END; 
*
ERROR at line 1:
ORA-06550: line 1, column 15:
PLS-00306: wrong number or types of arguments in call to 'ADD_CAPTURE'
ORA-06550: line 1, column 9:
PL/SQL: Statement ignored
ORA-06512: at "SYS.DBMS_WORKLOAD_REPLAY", line 2301
ORA-06512: at line 1
登入後複製

这种问题,一般我们都会做10046 trace进一步看调用了那个函数引起的问题。从trace中看到是在运行dbms_wrr_internal.add_capture出的问题。

BEGIN   :1 := dbms_wrr_internal.add_capture( :name,                                        :db_id,                                        :db_name, 
                              :db_version,                                        'tmp',                                        '/tmp', 
                  'TRUE',                                        :status,                                        NULL, 
NULL,                                        :stime,                                        NULL,                                        :sscn, 
                           :dflt_action,                                        NULL,                                        NULL, 
             :wid,                                        :internal_stime                                      ); END; 
END OF STMT 
PARSE #11529215044979176000:c=0,e=540,p=0,cr=0,cu=0,mis=1,r=0,dep=1,og=1,plh=0,tim=434859905841 
===================== 
PARSING IN CURSOR #11529215044979172808 len=8 dep=1 uid=0 oct=45 lid=0 tim=434859906846 hv=2761672982 ad='0' sqlid='8sst43uk9rk8q' 
ROLLBACK 
END OF STMT 
PARSE #11529215044979172808:c=0,e=12,p=0,cr=0,cu=0,mis=0,r=0,dep=1,og=0,plh=0,tim=434859906844 
XCTEND rlbk=1, rd_only=1, tim=434859906921 
EXEC #11529215044979172808:c=0,e=33,p=0,cr=0,cu=0,mis=0,r=0,dep=1,og=0,plh=0,tim=434859906939 
CLOSE #11529215044979172808:c=0,e=2,dep=1,type=3,tim=434859906960 
PARSE #11529215044979172808:c=0,e=6,p=0,cr=0,cu=0,mis=0,r=0,dep=1,og=0,plh=0,tim=434859907039 
XCTEND rlbk=1, rd_only=1, tim=434859907062 
EXEC #11529215044979172808:c=0,e=15,p=0,cr=0,cu=0,mis=0,r=0,dep=1,og=0,plh=0,tim=434859907074 
CLOSE #11529215044979172808:c=0,e=1,dep=1,type=3,tim=434859907091 
EXEC #11529215044981457272:c=10000,e=77698,p=0,cr=60,cu=29,mis=0,r=0,dep=0,og=1,plh=0,tim=434859907137 
ERROR #11529215044981457272:err=6550 tim=434859907154
SQL> desc dbms_wrr_internal 
FUNCTION ADD_CAPTURE RETURNS NUMBER 
Argument Name                  Type                    In/Out Default? 
------------------------------ ----------------------- ------ -------- 
NAME                           VARCHAR2                IN 
DB_ID                          NUMBER                  IN 
DB_NAME                        VARCHAR2                IN 
DB_VERSION                     VARCHAR2                IN 
DIR                            VARCHAR2                IN 
DPATH                          VARCHAR2                IN 
DPATH_SHARED                   VARCHAR2                IN 
STATUS                         VARCHAR2                IN 
ECODE                          NUMBER                  IN 
EMSG                           VARCHAR2                IN 
STIME                          DATE                    IN 
ETIME                          DATE                    IN 
SSCN                           NUMBER                  IN 
DEFAULT_ACTION                 VARCHAR2                IN 
AWR_DB_ID                      NUMBER                  IN 
AWR_BSNAP                      NUMBER                  IN 
WID                            VARCHAR2                IN
SQL> select NAME,DATATYPE_STRING,VALUE_STRING from v$sql_bind_capture where sql_id='3h55aw49j63g8'; 
no rows selected
登入後複製

本来以为10046能够把绑定变量这些数值抓出来,但是这里确没有,v$sql_bind_capture也抓不到绑定变量的值。我怀疑和内部的包有关系。所以我们无从判断是哪一个参数的调用类型出了问题。遇到这样的问题也没什么好的办法,以前在自己的Linux环境上搞过database replay,是能够成功的,所以想法就是把Linux上环境的这个包迁移到Hp环境上在试试。于是就用grep去搜索具体是那个文件。搜到了文件名为"prvtwrr.plb"的文件,里面是一堆加密的东西。把这个文件传到HP上运行,运行完后发现,妹的还是报以前的错误。郁闷啊,为什么在我Linux上的环境就可以了,在HP的环境就不行了。走投无路的时候,同事在$ORACLE_HOME目录下面执行了下列命令。

w4sd23pa#[/home/oracle]find $ORACLE_HOME -name "prvtwrr.plb" 
/oracle/app/oracle/product/11.2.0/db_1/rdbms/admin/prvtwrr.plb 
/oracle/app/oracle/product/11.2.0/db_1/.patch_storage/17411249_Apr_21_2014_22_29_21/files/rdbms/admin/prvtwrr.plb 
w4sd23pa#[/home/oracle] 
w4sd23pa#[/home/oracle]ls -l /oracle/app/oracle/product/11.2.0/db_1/rdbms/admin/prvtwrr.plb 
-rw-r--r--   1 oracle     oinstall    151611 Apr 22 13:29 /oracle/app/oracle/product/11.2.0/db_1/rdbms/admin/prvtwrr.plb 
w4sd23pa#[/home/oracle]ls -l /oracle/app/oracle/product/11.2.0/db_1/.patch_storage/17411249_Apr_21_2014_22_29_21/files/rdbms/admin/prvtwrr.plb 
-rw-r--r--   1 oracle     oinstall    149850 Sep 29  2013 /oracle/app/oracle/product/11.2.0/db_1/.patch_storage/17411249_Apr_21_2014_22_29_21/files/rdbms/admin/prvtwrr.plb
登入後複製

执行find命令居然发现能够找到两个文件,而另外一个文件明眼一看就是补丁文件17411249,赶紧用opatch看了一下补丁的情况。发现这个补丁是最近新装的。

w4sd23pa#[/home/oracle]opatch lsinventory 
Oracle Interim Patch Installer version 11.2.0.3.6 
Copyright (c) 2013, Oracle Corporation.  All rights reserved. 
Oracle Home       : /oracle/app/oracle/product/11.2.0/db_1 
Central Inventory : /oracle/app/oraInventory 
   from           : /oracle/app/oracle/product/11.2.0/db_1/oraInst.loc 
OPatch version    : 11.2.0.3.6 
OUI version       : 11.2.0.4.0 
Log file location : /oracle/app/oracle/product/11.2.0/db_1/cfgtoollogs/opatch/opatch2014-05-27_23-23-16PM_1.log 
Lsinventory Output file location : /oracle/app/oracle/product/11.2.0/db_1/cfgtoollogs/opatch/lsinv/lsinventory2014-05-27_23-23-16PM.txt 
-------------------------------------------------------------------------------- 
Installed Top-level Products (1): 
Oracle Database 11g                                                  11.2.0.4.0 
There are 1 product(s) installed in this Oracle Home. 
Interim patches (18) : 
Patch  17411249     : applied on Tue May 20 18:41:12 GMT+08:00 2014 
Unique Patch ID:  17551033 
   Created on 21 Apr 2014, 22:29:21 hrs PST8PDT 
   Bugs fixed: 
     17411249
登入後複製

看到了这个信息之后,我们就怀疑是不是安装这个补丁出了问题。如果是的话,我们回退了再试试,于是我们把这个补丁做了一个回退,在readme里面看还要运行一个postinstall.sql脚本,回退完成后在执行预处理的操作发现居然成功了。然后我们再一次安装了这个补丁,运行了postinstall.sql脚本,发现预处理还是成功的。后面问了安装补丁的同事,最终发现是他忘记了执行postinstall.sql脚本。总的来说,这个故事还是很丧心病狂的,如果不去执行一把find命令,根本就不会发现是因为安装了新补丁造成的错误。

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

無法完成操作(錯誤0x0000771)印表機錯誤 無法完成操作(錯誤0x0000771)印表機錯誤 Mar 16, 2024 pm 03:50 PM

如果您在使用印表機時遇到錯誤訊息,例如操作無法完成(錯誤0x00000771),可能是因為印表機已中斷連線。在這種情況下,您可以透過以下方法解決問題。在本文中,我們將討論如何在Windows11/10PC上修復此問題。整個錯誤訊息說:操作無法完成(錯誤0x0000771)。指定的印表機已被刪除。修正WindowsPC上的0x00000771印表機錯誤若要修復印表機錯誤操作無法完成(錯誤0x0000771),指定的印表機已在Windows11/10PC上刪除,請遵循下列解決方案:重新啟動列印假脫機

揭秘HTTP狀態碼460的出現原因 揭秘HTTP狀態碼460的出現原因 Feb 19, 2024 pm 08:30 PM

解密HTTP狀態碼460:為什麼會出現這個錯誤?引言:在日常的網路使用中,常常會遇到各種各樣的錯誤提示,其中包括HTTP狀態碼。這些狀態碼是HTTP協定定義的一種機制,用來指示請求的處理。在這些狀態碼中,有一種比較罕見的錯誤碼,即460。本文將深入探討這個錯誤碼,並解釋為什麼會出現這個錯誤。 HTTP狀態碼460的定義:首先,我們要先了解HTTP狀態碼的基

Windows Update 更新提示Error 0x8024401c錯誤的解決方法 Windows Update 更新提示Error 0x8024401c錯誤的解決方法 Jun 08, 2024 pm 12:18 PM

目錄解決方法一解決方法二一、刪除Windows更新的臨時檔案二、修復受損的系統檔案三、檢視並修改登錄項目四、關閉網卡IPv6五、執行WindowsUpdateTroubleshootor工具進行修復六、關閉防火牆和其它相關的防毒軟體。七、關閉WidowsUpdate服務。解決方法三解決方法四華為電腦Windows更新出現「0x8024401c」報錯問題現象問題原因解決方案仍未解決?最近web伺服器因為系統漏洞需要更新,登入伺服器之後,更新提示錯誤碼0x8024401c解決方法一

解讀Oracle錯誤3114:原因及解決方法 解讀Oracle錯誤3114:原因及解決方法 Mar 08, 2024 pm 03:42 PM

標題:分析Oracle錯誤3114:原因及解決方法在使用Oracle資料庫時,常常會遇到各種錯誤代碼,其中錯誤3114是比較常見的一個。此錯誤一般涉及資料庫連結的問題,可能導致存取資料庫時出現異常狀況。本文將對Oracle錯誤3114進行解讀,探討其造成的原因,並給出解決該錯誤的具體方法以及相關的程式碼範例。 1.錯誤3114的定義Oracle錯誤3114通

香香腐宅app為什麼顯示錯誤 香香腐宅app為什麼顯示錯誤 Mar 19, 2024 am 08:04 AM

顯示錯誤是在香香腐宅app中可能會出現的問題,有些用戶還不太清楚香香腐宅app為什麼顯示錯誤,可能是網絡連接問題、後台程序過多、註冊信息錯誤等問題,接下來就是小編為使用者帶來的app顯示錯誤解決方法的介紹,有興趣的使用者快來一起看看吧!香香腐宅app為何顯示錯誤答案:網路連線問題、後台程式過多、註冊資訊錯誤等詳情介紹:1、【網路問題】解決方法:檢視裝置連線網路狀態,重新連線或選擇其他網路連線使用即可。 2.【後台程式過多】解決方法:關閉正在運作的其他程序,釋放系統,可以加快軟體的運作。 3、【註冊資訊錯

解決jQuery AJAX請求遇到403錯誤的方法 解決jQuery AJAX請求遇到403錯誤的方法 Feb 20, 2024 am 10:07 AM

標題:解決jQueryAJAX請求出現403錯誤的方法及程式碼範例403錯誤是指伺服器禁止存取資源的請求,通常會導致出現這個錯誤的原因是請求缺少權限或被伺服器拒絕。在進行jQueryAJAX請求時,有時會遇到這種情況,本文將介紹如何解決這個問題,並提供程式碼範例。解決方法:檢查權限:首先要確保請求的URL位址是正確的,同時驗證是否有足夠的權限來存取該資

Linux Oops:詳解這錯誤的意義 Linux Oops:詳解這錯誤的意義 Mar 21, 2024 am 09:06 AM

LinuxOops:詳解這一錯誤的含義,需要具體程式碼範例什麼是LinuxOops?在Linux系統中,"Oops"指的是核心出現了一個嚴重的錯誤導致系統崩潰的情況。 Oops實際上是一種核心崩潰的機制,它會在發生致命錯誤時停止系統運行,並列印相關的錯誤訊息,以便開發者對問題進行診斷和修復。 Oops通常發生在核心空間中,與用戶空間的應用程式無關。當內核遇到

Fatal:無法快轉,GIT pull錯誤中止 Fatal:無法快轉,GIT pull錯誤中止 Feb 20, 2024 am 09:13 AM

當執行gitpull操作時,可能會遇到無法快轉的致命錯誤,導致進程被中止。即使嘗試使用-ff-only也無法解決問題。本文將探討可能的解決方案和因應措施。修正致命錯誤:無法快轉,中止GIT拉取錯誤如果出現致命錯誤:無法快進,正在中止GitPull錯誤,請遵循下面提到的解決方案來解決問題。拉變基將主分支中的變更合併到新分支中讓我們詳細地談一談。 1]使用重定基數拉動除了通常使用的“gitpull”命令外,您還可以嘗試“gitpull-rebase”命令。這個命令會先取得遠端分支的最新更改,然後將您的

See all articles