February 23, 2010
The are a large number of initialization parameters that configure the behavior of an Oracle database instance, and it seems that the number of hidden parameters (those parameters that begin with _ ) continues to grow with each new Oracle Database release. In some cases, parameters that were once normal parameters became hidden parameters in later releases (the SPIN_COUNT, and _SPIN_COUNT parameters are one example). In other cases, the normal parameter defines the minimum requested parameter value and the hidden parameter defines the current value (DB_CACHE_SIZE and __DB_CACHE_SIZE parameters, respectively).
For documentation purposes it might be helpful to permanently record the values of the normal and hidden initialization parameters, and that is the purpose of the VBS script in this article. The script uses a SQL statement that was originally found here, and then was modified so that the normal and hidden versions of the parameters will sort into adjacent rows when dislayed on screen. Once the parameter values are written to Excel, the Excel worksheet is automatically saved with the value of the DB_NAME initialization parameter and the current date and time. When targeting an 11.2.0.1 database, the output might look like the following screen capture:
Unfortunately, we have a slight problem. The SQL statement in the script must be executed as the SYS user, and if the O7_DICTIONARY_ACCESSIBILITY initialization parameter is set to FALSE (the default starting with Oracle 9.0.1), the normal connection string used in previous scripts will not work (I have not found a way to pass AS SYSDBA when Provider=OraOLEDB.Oracle is specified in the connection string). If you do not want to set the O7_DICTIONARY_ACCESSIBILITY initialization parameter to TRUE, you will need to create an ODBC connection to the database.
To create an ODBC connection, launch the ODBC Data Source Administrator utility from the Control Panel, and switch to the System DSN tab. Click Add… then select one of the ODBC providers offered by Oracle Corp (you may need to perform a custom install of the Oracle Client for Oracle’s ODBC client to appear in the list – note that there is a separate 32 bit and 64 bit ODBC Administrator on 64 bit Windows, with the 32 bit version located in the Windows\SysWow64 folder, see this article for more information):
Pick a generic name for the ODBC connection, such as MyODBC (this is the name used in the script) and then enter the database name from the Tnsnames.ora file into the TNS Service Name box (I specified or112) – note that you can change this database name at a later time to point the script at a different database. Click OK.
The VBS script to extract the normal and hidden parameters follows (modify the script to specify the correct password for the SYS user):
'Version 1.0 Const adCmdText = 1 Const adCmdStoredProc = 4 Const adParamInput = 1 Const adVarNumeric = 139 Const adBigInt = 20 Const adDecimal = 14 Const adDouble = 5 Const adInteger = 3 Const adLongVarBinary = 205 Const adNumeric = 131 Const adSingle = 4 Const adSmallInt = 2 Const adTinyInt = 16 Const adUnsignedBigInt = 21 Const adUnsignedInt = 19 Const adUnsignedSmallInt = 18 Const adUnsignedTinyInt = 17 Const adDate = 7 Const adDBDate = 133 Const adDBTimeStamp = 135 Const adDBTime = 134 Const adVarChar = 200 Const adUseClient = 3 Dim strUsername Dim strPassword Dim strDatabase Dim strSQL 'SQL statement Dim objExcel 'For sending the output to Excel Dim snpData 'ADO Recordset object used to retrieve the user's data Dim dbDatabase 'ADO database connection object Dim intTempCount 'Counter of the number of Excel sheets that have been created Dim strDBNAME 'DB_NAME parameter from the database parameters Dim strLastColumn 'Column identifier in Excel of the right-most column Dim i 'Counter On Error Resume Next Set snpData = CreateObject("ADODB.Recordset") Set dbDatabase = CreateObject("ADODB.Connection") 'Create an Excel connection Set objExcel = CreateObject("Excel.Application") 'Set up to allow exporting, if requested objExcel.DisplayAlerts = False objExcel.Workbooks.Add strUsername = "sys" 'Must connect as the SYS user strPassword = "SysPassword" strDatabase = "MyODBC" 'Must use an ODBC connection if O7_DICTIONARY_ACCESSIBILITY = FALSE If UCase(strUsername) <> "SYS" Then 'Can use this for SYS if O7_DICTIONARY_ACCESSIBILITY = TRUE, ODBC connection then not required dbDatabase.ConnectionString = "Provider=OraOLEDB.Oracle;Data Source=" & strDatabase & ";User ID=" & strUsername & ";Password=" & strPassword & ";" Else 'Must use an ODBC connection if O7_DICTIONARY_ACCESSIBILITY = FALSE dbDatabase.ConnectionString = "Data Source=" & strDatabase & ";User ID=" & strUsername & ";Password=" & strPassword & " AS SYSDBA;" End If dbDatabase.Open 'Should verify that the connection attempt was successful, but I will leave that for someone else to code If Err <> 0 Then MsgBox "Not Connected, Error: " & Err Else 'Adapted from the SQL statement at http://www.jlcomp.demon.co.uk/params.html strSQL = "SELECT " & vbCrLf strSQL = strSQL & " UPPER(NAM.KSPPINM) NAME," & vbCrLf strSQL = strSQL & " VAL.KSPPSTVL VALUE," & vbCrLf strSQL = strSQL & " NAM.INDX+1 NUM," & vbCrLf strSQL = strSQL & " NAM.KSPPITY TYPE," & vbCrLf strSQL = strSQL & " VAL.KSPPSTDF ISDEFAULT," & vbCrLf strSQL = strSQL & " DECODE(BITAND(NAM.KSPPIFLG/256,1),1,'TRUE','FALSE') ISSES_MODIFIABLE," & vbCrLf strSQL = strSQL & " DECODE(BITAND(NAM.KSPPIFLG/65536,3)," & vbCrLf strSQL = strSQL & " 1,'IMMEDIATE'," & vbCrLf strSQL = strSQL & " 2,'DEFERRED' ," & vbCrLf strSQL = strSQL & " 3,'IMMEDIATE'," & vbCrLf strSQL = strSQL & " 'FALSE') ISSYS_MODIFIABLE," & vbCrLf strSQL = strSQL & " DECODE(BITAND(VAL.KSPPSTVF,7)," & vbCrLf strSQL = strSQL & " 1,'MODIFIED'," & vbCrLf strSQL = strSQL & " 4,'SYSTEM MODIFIED'," & vbCrLf strSQL = strSQL & " 'FALSE') ISMODIFIED," & vbCrLf strSQL = strSQL & " DECODE(BITAND(VAL.KSPPSTVF,2),2,'TRUE', 'FALSE') ISADJUSTED," & vbCrLf strSQL = strSQL & " NAM.KSPPDESC DESCRIPTION" & vbCrLf strSQL = strSQL & "FROM" & vbCrLf strSQL = strSQL & " X$KSPPI NAM," & vbCrLf strSQL = strSQL & " X$KSPPSV VAL" & vbCrLf strSQL = strSQL & "WHERE " & vbCrLf strSQL = strSQL & " NAM.INDX = VAL.INDX " & vbCrLf strSQL = strSQL & "ORDER BY" & vbCrLf strSQL = strSQL & " UPPER(DECODE(SUBSTR(NAM.KSPPINM,1,2),'__',SUBSTR(NAM.KSPPINM,3)," & vbCrLf strSQL = strSQL & " DECODE(SUBSTR(NAM.KSPPINM,1,1),'_',SUBSTR(NAM.KSPPINM,2),NAM.KSPPINM)))," & vbCrLf strSQL = strSQL & " UPPER(NAM.KSPPINM)" snpData.Open strSQL, dbDatabase If snpData.State = 1 Then If Not (snpData.EOF) Then With objExcel .Visible = True .ActiveWorkbook.Sheets.Add .ActiveSheet.Name = "DB Parameters" For i = 0 To snpData.Fields.Count - 1 .ActiveSheet.Cells(1, i + 1).Value = snpData.Fields(i).Name Next .ActiveSheet.Range(.ActiveSheet.Cells(1, 1), .ActiveSheet.Cells(1, snpData.Fields.Count)).Font.Bold = True 'Format the columns in the spreadsheet For i = 0 To snpData.Fields.Count - 1 strLastColumn = Chr(64 + ((i + 1) Mod 26)) .Columns(strLastColumn).Select Select Case snpData.Fields(i).Type Case adDate, adDBDate, adDBTimeStamp, adDBTime .Selection.HorizontalAlignment = -4152 .Selection.NumberFormat = "mm/dd/yy hh:nn AM/PM" Case adBigInt, adInteger, adSmallInt, adTinyInt, adUnsignedBigInt, adUnsignedInt, adUnsignedSmallInt, adUnsignedTinyInt .Selection.HorizontalAlignment = -4152 .Selection.NumberFormat = "0" Case adVarNumeric, adDecimal, adDouble, adNumeric, adSingle .Selection.HorizontalAlignment = -4152 .Selection.NumberFormat = "0" Case adVarChar .Selection.HorizontalAlignment = -4131 .Selection.NumberFormat = "@" End Select Next strLastColumn = Chr(64 + ((snpData.Fields.Count + 1) Mod 26)) .ActiveSheet.Range("A2").CopyFromRecordset snpData 'Auto-fit up to columns .ActiveSheet.Columns("A:" & strLastColumn).AutoFit .ActiveSheet.Range("B2").Select .ActiveWindow.FreezePanes = True .Application.DisplayAlerts = False 'Remove the default worksheets For i = 1 To ActiveWorkbook.Sheets.Count If .ActiveWorkbook.Sheets(i).Name = "Sheet1" Then .Sheets("Sheet1").Select .ActiveWindow.SelectedSheets.Delete End If If .ActiveWorkbook.Sheets(i).Name = "Sheet2" Then .Sheets("Sheet2").Select .ActiveWindow.SelectedSheets.Delete End If If .ActiveWorkbook.Sheets(i).Name = "Sheet3" Then .Sheets("Sheet3").Select .ActiveWindow.SelectedSheets.Delete End If Next End With snpData.Close 'Repeat the SQL statement to find the value of the DB_NAME parameter snpData.Open strSQL, dbDatabase Do While Not (snpData.EOF) If UCase(snpData("name")) = "DB_NAME" Then strDBNAME = snpData("value") Exit Do End If snpData.MoveNext Loop Else MsgBox "No Rows Returned" End If Else MsgBox "Could Not Open the SQL Statement " & Err End If snpData.Close objExcel.ActiveWorkbook.SaveAs "C:\OracleParameters " & strDBNAME & " " & Replace(Replace(Now, "/", "-"), ":", "-") & ".xls" End If 'Clean Up Set objExcel = Nothing Set snpData = Nothing dbDatabase.Close Set dbDatabase = Nothing
When the script runs it will create a spreadsheet in the root of the C:\ drive – move the spreadsheet as needed for documentation purposes.
Leave a comment