Wo sind die Default NLS-Parameter definiert ? Der Parameter NLS_DATE_FORMAT ist wichtig, wenn man keine
expliziten Datumsmasken verwendet. SELECT * FROM nls_instance_parameters; SELECT * FROM nls_database_parameters;
PARAMETER
VALUE Ein oft gestellte Frage im Zusammenhang mit Oracle lautet: Wie kann man 1 Minute oder 10 Sekunden zu einem gegebenen Datum addieren oder subtrahieren. Dazu der folgende Ausschnitt aus dem Oracle SQL Manual: You can add and subtract number constants as well as other dates from dates. Oracle interprets number constants in arithmetic date expressions as numbers of days. For example, SYSDATE + 1 is tomorrow. SYSDATE - 7 is one week ago. SYSDATE + (10/1440) is ten minutes from now. Subtracting the HIREDATE column of the EMP table from SYSDATE returns the number of days since each employee was hired. You cannot multiply or divide DATE values. Oracle provides functions for many common date operations. For example, the ADD_MONTHS function lets you add or subtract months from a date. The MONTHS_BETWEEN function returns the number of months between two dates. The fractional portion of the result represents that portion of a 31-day month. Unsere Happy New Year 2000 Function lautet also: set serveroutput on; How to implement Sleep Funktion in PL/SQL ? Gibt es unter Oracle PL/SQL eine SLEEP Funktion ? .... Ja. Die folgende kleine Funktion versucht eine System Ressource zu erhalten, zB wenn ein Index kreiert werden soll auf einer "Busy" Tabelle. Man wartet eine gewisse Zeit und versucht es solange bis der Zähler das Maximum erreicht hat. CREATE OR REPLACE PROCEDURE TryToGetSlot IS As I understand it, industry standard VARCHAR types can store 'empty' strings, but Oracle currently does not, although it reserves the right to change the functionality of VARCHAR types to have this feature. Oracle invented the VARCHAR2 type which is the non-standard varchar (which changes empty strings to nulls), and *currently* the VARCHAR is just a synonym for VARCHAR2. Oracle advises everyone to use VARCHAR2 and not VARCHAR if they wish to maintain backward compatiblity. If a column in a row has no value, then column is said to be null, or to contain a null. Nulls can appear in columns of any datatype that are not restricted by NOT NULL or PRIMARY KEY integrity constraints. Use a null when the actual value is not known or when a value would not be meaningful. Do not use null to represent a value of zero, because they are not equivalent. (Oracle currently treats a character value with a length of zero as null. However, this may not continue to be true in future releases, and Oracle recommends that you do not treat empty strings the same as NULLs.) Any arithmetic expression containing a null always evaluates to null. For example, null added to 10 is null. In fact, all operators (except concatenation) return null when given a null operand. Oracle is usually careful to maintain backward compatibility, so I'd be slightly surprised to see this change even in Oracle 9 and very surprised to see it change in any version of Oracle 8. The mistery of ROWNUM and ORDER BY From the Oracle7 Server SQL Reference Manual: ROWNUM Oracle7 assigns a ROWNUM value to each row as it is retrieved, before rows are sorted for an ORDER BY clause, so an ORDER BY clause normally does not affect the ROWNUM of each row. However, if an ORDER BY clause causes Oracle7 to use an index to access the data, Oracle7 may retrieve the rows in a different order than without the index, so the ROWNUMs may differ than without the ORDER BY clause. You can use ROWNUM to limit the number of rows returned by a query, as in this example: SELECT * FROM emp WHERE ROWNUM < 10; You can also use ROWNUM to assign unique values to each row of a table, as in this example: UPDATE tabx SET col1 = ROWNUM; Note that conditions testing for ROWNUM values greater than a positive integer are always false. For example, this query returns no rows: SELECT * FROM emp WHERE ROWNUM > 1; The first row fetched is assigned a ROWNUM of 1 and makes the condition
false. The second row Can I replicate only certain partitions of a partitioned table ? If so, how ? ..... Solution Summary: YOU HAVE TO REPLICATE THE ENTIRE
TABLE How to set «seminfo_semmni» on Sun-Solaris / Oracle ? Nach einer Hardware Migration unter SUN-Solaris / Oracle konnte die grosse Datenbank eines Kunden nicht mehr gestartet werden. Kernelparameter werden unter Sun-Solaris in /etc/system eingestellt. Besonders wichtig im Zusammenhang sind Parameter, welche die Anzahl Semaphoren und die Grösse des Shared Memory festlegen: set semsys:seminfo_semmni=400 Diese Zeile limitiert die "Number of semaphore identifiers". Der Wert muss mindestens so gross wie PROCESSES in initSID.ora sein. Bei mehreren DB's die Summe aller PROCESSES. Nach der Änderung dieses Kernelparameters muss ein System-Reboot durchgeführt werden. Help with SQL -- aus unserem Support Alltag Frage Wie kann ich folgende zwei SQL Statements in einem zusammenfassen ? SELECT ms_id Beispielsweise etwa so ? INSERT INTO ONP (onp_id, ms_id, request) Antwort Die selektierten Werte eines SQL SELECT's müssen nicht zwingend aus einer Tabelle stammen wie die folgende einfache Lösung demonstriert: INSERT INTO onp (onp_id,ms_id,request) Geändertes UPDATE Verhalten ab Oracle 8i Sie möchten alle Werte eines Attributes einer Tabelle mit einem Wert
aus einer anderen Tabelle erhöhen, oder etwas "mathematischer" ausgedrückt: Beispiel: ACCOUNT und BOOKING Tabelle CREATE TABLE booking ( Unter Oracle 8i kann dies mit dem folgenden, einfach verständlichen SQL Statement durchgeführt werden: UPDATE account A Bei allen Oracle Releases < 8.1.5 erhält man folgende Fehlermeldung: ERROR at line 2: Man muss in diesem Fall das SQL Statement wie folgt formulieren: UPDATE account A Als Ergebnis erhält man in beiden Fällen das folgende Resultat: ACC_ID BALANCE Wie findet man den maximalen Wert aus einer Gruppe ? Diese simple Aufgabenstellung wird häufig an uns gestellt, da sie offenbar auf den ersten Blick einfach erscheint, dann aber meistens zu falschen Ergebnissen führt. Wir möchten diesen Sachverhalt an einem typischen Beispiel erläutern. Gegeben ist folgende Liste mit drei Gruppen: SELECT acq_id "AcqID", Man ist versucht, als ersten Ansatz das folgende Query zu verwenden, das aber nicht das gewünschte Resultat liefert. SELECT acq_id "AcqID", AcqID DateSent Lösung: WHERE Bedingung und GROUP BY in Subquery verpacken Mittels folgendem Subquery kann der maximale Wert einer Gruppe
herausgefunden werden. Besonders interessant dabei ist, dass man auch alle Attribute
selektieren kann, da die SELECT acq_id "AcqID", AcqID DateSent oder alle Attribute selektieren SELECT * How to create a read-only table ? Oracle-7 und 8 ermöglicht es, Tablespaces als «Read-Only» zu definieren. Manchmal möchte man jedoch nur eine einzelne Tabelle mit diesem Attribut versehen, dies natürlich für alle Applikationen. CREATE TRIGGER tab_readonly How to remove «in-doubt» transactions ? In doubt transactions may occur at double phase commit time for network, break node ... reason. Normally if a double phase commit failed, you may have some entries in views DBA_2PC_PENDING and DBA_2PC_NEIGHBORS. To force the in doubt transaction to rollback you have to use the command: ROLLBACK FORCE <transaction_id>; Unfortunately, sometime the entries are still there ... and you may discover in your alert<sid>.log file something like: ora-600 [18104] ... This point to bug 445604 Fixes in version Oracle 7.3.4 Now it's possible to use package DBMS_TRANSACTION to solve the problem if rollback force do not clean all entries. Do as follow: EXECUTE DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY('xid'); Where 'xid' come from: SELECT local_tran_id FROM DBA_2PC_PENDING; Multi-Threaded Server (Average Wait Time) If wait time gets to be excessive, then more dispatchers need to be activated. If the value increases as the number of concurrent users increases, increase the number of dispatchers. The query to determine this is. COLUMN wait_time FORMAT 99999 heading "Average Wait" SELECT network protocol, This query should be run multiple times daily during both light and heavy usage. Force a rollback segment offline If you are using public rollback segments it may be difficult to force a rollback segment offline and keep it there, unless you use the following INIT.ORA paramater. This is useful when a rollback segment has been corrupted or must be dropped and rebuild. _offline_rollback_segments = <RBS-name> Anzeige des letzten Checkpoints in den File Headern select FILE# file_nr, Anzahl Query Reparsings im Shared Pool Wie viele Queries müssen neu geparst werden im Vergleich zu den total Ausgeführten ? select sum(pins) "SQL Executions", Executions Necessary SQL Reparsing Freier Platz im Shared Pool anzeigen select * from v$sgastat Hints und ANALYZE für Bitmap Index Zugriff Damit ein Bitmap Index Zugriff vom COST based Optimizer favorisiert und ausgeführt wird müssen die Optimizer Statistiken korrekt aufgesetzt sein. Es reicht jedoch nicht aus, nur das entsprechende Schema einem ANALYZE zu unterziehen, es muss auf das entsprechende Table-Column ausgeweitet werden. Der Hint muss (wie im Tuningguide beschrieben) mit der exakten Tabellenbezeichnung gemacht werden, d.h. wenn ein Tablealias angewendet wird, MUSS im Hint auch die Tabelle mit dem Alias referenziert werden. ANALYZE für Bitmap Index Zugriff auf dem Column STATUS ANALYZE INDEX bitmap_index ESTIMATE STATISTICS; Angabe des Hint SELECT /*+ INDEX(tab_alias bitmap_index) */ ......, How to set date format for best Y2k Compliance ? Oracle suggest the date format
NLS_DATE_FORMAT='YY-MON-RR' in order to overwrite the default of
'YY-MON-YY'. This way, any program that was developed assuming the default
date format of 'YY-MON-YY', will work properly. To facilitate year 2000 compliance for
applications that use the two-digit year format the Oracle7 Server and Oracle8 Server
provides a special year The Oracle RDBMS has always stored dates using a four-digit year (the ‘OraDate’ format), hence customers using the DATE data type should not have any application level problems. To facilitate year 2000 compliance for applications that use the two-digit year format the Oracle7 Server and Oracle8 Server provides a special year format mask ‘RR’. Using the ‘RR’ format, any two-digit year entered will be converted thus:
Therefore, regardless of the current century at the time the data is entered the 'RR' format will ensure that the year stored in the database is as follows: If the current year is in the second half of the century (50 - 99)
If the current year is in the first half of the century (00 - 49)
The ‘RR’ date format is available for inserting and updating DATE data in the database. It is not required for retrieval/query of data already stored in the database as Oracle has always stored the YEAR component of a date in it’s four-digit form. How to protect PL/SQL Source Code ? PL/SQL V-2.2, available with Oracle 7.2, implements a binary wrapper for PL/SQL to protect the source code. This is done via a standalone utility that transforms the PL/SQL source code into portable binary object code (somewhat larger than the original). This way you can distribute software without having worry about exposing your proprietary algorithms and methods. SQLPLUS and SVRMGRL will still understand and know to execute such scripts. Just be careful, there is no "decode" command available, the syntax is: wrap iname=myplsqlsource.sql oname=myplsqlsource.plb (UNIX) How to switch to another Orcale User as DBA ? Many batch jobs must change a user password to a "dummy" password to login as this user temporarilly. The problem is always the encrypted password which cannot be de-crypted so that the password can be reset to the original. There is a way to do this, using the VALUES keyword, this is exactly what IMPORT does when it must create users. We show you how to perform this task using the famous account of SCOTT/TIGER. If a DBA doesn't know the password "TIGER", he can temporarilly change this password to another password, logon as user SCOTT, and set the password back after the jobs as user SCOTT is done. Follow the instructions below:
Show object sizes in the database It's often very interesting to know the size of each object in the database. For example if you need to pin a package, trigger in the memory. Note, that NOT the size of a table including the rows will be shown, but the size of the table itself. Object
Source Parsed Code Viewing The SQL Statements of the CPU-Intensive Oracle Processes First get the top 10 CPU-intensive Oracle processes on the operating system with the first column giving the %CPU used, the second column unix PID, the third column USER , the fourth column TERMINAL, and the last column Unix PROCESS (works only for UNIX). ps -eaf -o pcpu,pid,user,tty,comm | grep ora | Now you can specify the found PID in the following SQL-Statement: column username format a9 How to find out which object is corrupted ? During a SELECT statement, we get the error: ORA-1578: file#1 block#3840 corrupted Oracle block. It is telling us, that the corruption took place in file#1. This always a SYSTEM tablespace file. This may mean that the corrption problem may only be resolved with the recreation of the database follwed by a full database import. Only if this is the case, do a full database export with the database unavailable to users immediately followed by the database recreation and import in order to prevent loss of data. Now how to find out exactly which object is corrupted. It may be a rollback segment or an index that can simply be recreated. Let's see how we can find out this. Connect to an DBA account: SELECT segment_type, segment_name or use: SELECT segment_type, segment_name This is a simulated example, altough file#1 ALWAYS belongs to the SYSTEM tablespace, block #3840 could be anything. Lower block numbers in the #1 file are likely bootstrap segments. In this case I_SOURCE is corrupted, this is a SYS Index that cannot be dropped. In this case only recreating the database will resolve the problem. If it is a table it must be understood that the data within the corrupted blocks is lost. You can try to save as much of the data in the corrupted table before the bad block and create a new table around the corrupted part. Get the rowid's around the corrupted block with: SELECT ROWIDTOCHAR(rowid) FROM <table-name>; How to create an empty copy of an existing table ? CREATE TABLE new_table AS How to remove duplicate rows from a table ? SQL> select * from address; How to create a new Control file, how to document the Database ? Connect as SYSTEM or SYS and do: ALTER DATABASE BACKUP CONTROLFILE TO TRACE; The TRACE File for the Controlfile can be found in the directory defined by the init.ora Parameter: core_dump_dest. How to enable / disable Archiving (Online-Backup) Check that the following parameters are set in init<SID>.ora: LOG_ARCHIVE_DEST Enable or disable Archiving with svrmgrl Manually archives the current log file group, forcing a log switch alter system archive log current; Manually archives all full unarchived redo log file groups alter system archive log all; How many valid / invalid objects exists owned by this oracle user ? Often we should know, how many valid and invalid objects an oracle user ows. Specially if we compare a schema on two different databases. SELECT DISTINCT (object_type) object, status, COUNT(*) How many extents are used by a rollback segment If you are running large transactions it is important to have enough rollback segment space. To check the current allocated number of extents and the max number of extens in a rollback segment, use the following query: SELECT COUNT(*) FROM dba_extents DBA_EXTENTS: This view lists the extents comprising all segments. Startup with a corrupted Redo-Log There may be situations where you need to startup with a corrupted redo log. In this case there is an init.ora parameter that allows this: _ALLOW_RESETLOGS_CORRUPTED=TRUE. However, this will startup even if it results in corrupted data, so only use it if you have to and only to startup long enough to get an export of critical data. Use only under the guidance of Oracle Support. In order to cache a table in the SGA it has to be smaller than CACHE_SIZE_THRESHOLD as set in the init.ora file. However, the cost based analyzer doesn't take table cacheing into account when doing optimization so you may want to force the table using hints. Increase Speed with Large Imports For large imports, import with INDEXES=N and build your indexes seperately to increase import speed. Tracking and validating objects Oracle can use event setpoints in the initialization file for tracking and validation of objects. For example: event="10210 trace name context forever, level 10" sets integrity
checking for tables The last event setting (10231) will allow export to extract all data, except the corrupted block, from a table. You should only use these under guidance from Oracle support. Garantiert die konsistente Sicht der Daten, während des gleichzeitigen Schreibens von Transaktionen durch andere Sessions. SET TRANSACTION READ ONLY; Die drei SELECT's sind lesekonsistent, das heisst man sieht die Daten wie sie zum Zeitpunkt des Kommandos SET TRANSACTION READ ONLY waren. In PL/SQL kann die Funktion DBMS_TRANSACTION.READ_ONLY; verwendet werden. Bei folgenden Statements möglich: CREATE TABLE xxx AS SELECT * FROM xxx UNRECOVERABLE;
Wait -Statistiken auf Datenbuffer, Rollback-Segmenten SELECT * FROM v$waitstat; Verfügbare V$ und X$ Tabellen, Definierte Views mit SQL-Text SELECT * FROM v$fixed_table; User mit offenen Transaktionen SELECT username, machine, terminal, program Normalerweise werden Blöcke, welche über einen Fulltable-Scan gelesen werden nicht in der SGA gehalten, sondern gleich wieder entfernt. Dies kann für "Lookup-Tabellen" verhindert werden, alle Rows bleiben dann auch nach einem Fulltablesan in der SGA. ALTER TABLE emp CACHE; Empfehlungen zu Storage Parametern - PCTFREE und PCTUSED müssen zusammen weniger als 100% ergeben Index in anderen Tablespace verlegen während des laufenden Betriebes ALTER INDEX xxx REBUILD Der freie Platz und dessen Fragmentierung kann im Oracle Tablespace Manager oder mit einem einfachen SQL-Script angezeigt werden. Klicken Sie hier um den Source-Code zu sehen. Wenn für eine Tabelle ein Extent benötigt wird, so sucht Oracle die Liste der freien Extents ab. Die erste ausreichend grosse Lücke wird alloziert. Wird keine ausreichend grosse Lücke gefunden, so wird die Liste nochmals abgesucht, ob es benachbarte freie Lücken gibt, welche zsammen ausreichend gross sind. Falls noch immer keine ausreichend grosse Lücke gefunden werden kann, so wird die Fehlermeldung "failed to allocate extent of size <bytes> in tablespace <tablespace>" generiert (falls nicht ein Datafile mit AUTOEXTEND vergrössert werden kann). Zusammenhängende freie Lücken können zusammengefügt werden mittels: ALTER TABLESPACE xxx COALESCE; Stored Procedure für alle Tablespaces: CREATE OR REPLACE PROCEDURE coats IS Identifikation von kritischen Tabellen und Indexes Wenn der Platz in einem Tablespace knapp ist können Tabellen oder Indexes keine weiteren Extents allozieren. Dies kann auch eintreten, wenn die Extents zu gross spezifiziert wurden oder PCTINCREASE grösser als 0 gewählt wurde. Man kann auf einfache Weise testen, ob ein weiterer Extent alloziert werden kann. ALTER TABLE emp ALLOCATE EXTENT;
Zuordnung einer Transaktion zu einem Rollback-Segment Zur Erinnerung sei hier nochmals darauf hingewiesen dass: - Eine Transaktion kann nur ein Rollback-Segment verwenden Für lang dauernde Transaktionen ist es oft ein Vorteil ein spezielles Rollback-Segment zu erstellen und dieses der Transaktion zuzuweisen. SET TRANSACTION USE ROLLBACK SEGMENT rbs01; /* SQL*Plus
*/ Mit COMMIT oder ROLLBACK wird die Zuweisung wieder aufgehoben. Undokumentierte INIT.ORA Parameter Mit dem folgenden Query können unter dem User SYS die undokumentierten INIT.ORA Parameter abgefagt werden: set pages 100 Wichtiges zu Referential Integrity und Constraints Constraints immer mit einem Namen versehen, da ansonsten nichtssagende Namen (SYS_cnnnn) in Fehlermeldungen erscheinen. Ein Debugging wird dadurch erschwert.
|