Announcement

Collapse
No announcement yet.

v$sqlarea aus SID

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • v$sqlarea aus SID

    Hi
    ich suche eine Möglichkeit aus der v$sqlarea mein SQL auszuleden welches ich gerade abesetzt habe, nach dem es durch ist.

    Beispiel: meine SID ist 176

    Select 123456 from dual;
    -- in der selben Sitzung danach:

    SELECT a.sql_text
    FROM v$session s, v$sqlarea a
    WHERE a.HASH_VALUE = s.sql_HASH_VALUE
    WHERE a.ADDRESS = s.SQL_ADDRESS
    AND s.sid = 176 ;

    Ich hab auch schon die Felder : PREV_SQL_ADDR und PREV_HASH_VALUE probiert.

    wer weis rat?

  • #2
    Hallo,

    vielleicht hilft dir das weiter:

    select sql_text, parsing_user_id, parsing_schema_id from v$sql
    where address in (select sql_address from v$session
    where sid=176
    )
    Gruß

    Ralf

    Comment


    • #3
      nein leder nicht. Das funktioniert nur zur Laufzeit meines SQLs

      Comment


      • #4
        Komisch, bei mir geht's.

        Code:
        system@XXX> select sql_text, parsing_user_id, parsing_schema_id from v$sql
          2  where address in (select sql_address from v$session
          3  where sid=146);
        SQL_TEXT
        PARSING_USER_ID PARSING_SCHEMA_ID
        select 234 from dual
                     55                55
        
        system@XXX> /
        SQL_TEXT
        PARSING_USER_ID PARSING_SCHEMA_ID
        select 567 from dual
                     55                55
        Ralf

        Comment


        • #5
          Das geht solange, wie dieses SQL auf der DB nicht schon einmal verwendet worden ist und somit zu einem früheren Zeitpunkt ein Eintrag in der v$sqlarea erstellt wurde.
          Der Eintrag in der v$sqlarea wird nicht, beim erneuten ausführen, erneuert. Und somit auch nicht die SQL_id . Diese verweisst weiter auf das SQL welches den Eintrag ursprünglich ausgelöst hat.

          Also ist meine eigendliche Frage: Gibt es eine Verbindung von der v$session zur v$sqlarea auch wenn das SQL mehrfach, auch in verschiedenen Sitzungen ausgeführt wurde.

          Comment


          • #6
            Gibt es eine Verbindung von der v$session zur v$sqlarea auch wenn das SQL mehrfach, auch in verschiedenen Sitzungen ausgeführt wurde.
            Die gibt es, allerdings muss der Parameter session_cached_cursors > 0 sein:

            Code:
            select c.user_name, c.sid,c.sql_id, sql.sql_text
              from v$open_cursor c,
                   v$sql sql,
                   (select sid from v$mystat where rownum=1)m
             where c.sql_id=sql.sql_id 
               and c.sid=m.sid
            Dim
            Zitat Tom Kyte:
            I have a simple philosophy when it comes to the Oracle Database: you can treat it as a black box and just stick data into it, or you can understand how it works and exploit it as a powerful computing environment.

            Comment


            • #7
              Hi Dim,
              kannst du mir das erklären.
              Wenn ich dein SQL absetze, nach dem ich ein "select 'test' from dual;"
              in der Sitzung sid = 266 absetze bekommen ich aus der v$sql nicht den Eintrag den ich suche.
              Setze ich in Sitzung sid = 303 "select 'test3' from dual where 2= 3-1" ab, bekomme ich wieder 5 Sätze aus der v$sql die aber nichts mit meiner Sitzung zu tun haben.
              Sehe ich in der v$session nach, haben die sid, sql_id und prev_sql_id ebenfalls nichts mit dem zu tun was ich suche. In PREV_SQL_ID finde ich immer dieselbe SQL_ID von einem SQL das ich bewust nicht abgesetzt habe.

              SID SQL_ID SQL_TEXT
              ---- ------------- ----------------------------------------------------
              266 9babjv8yq8ru3 BEGIN DBMS_OUTPUT.GET_LINES(:LINES, :NUMLINES); END;
              266 9babjv8yq8ru3 BEGIN DBMS_OUTPUT.GET_LINES(:LINES, :NUMLINES); END;
              266 gpfqfy1ytzc36 SELECT UPDTOP FROM YT_UPDTOP WHERE UPPER(KENNUNG) =
              266 25b9ahdjtmu4d SELECT c.USER_name, c.sid,c.SQL_id, SQL.SQL_text FR

              SID SQL_ID SQL_TEXT
              --- ------------- ----------------------------------------------
              9babjv8yq8ru3 BEGIN DBMS_OUTPUT.GET_LINES(:LINES, :NUMLINES)
              9babjv8yq8ru3 BEGIN DBMS_OUTPUT.GET_LINES(:LINES, :NUMLINES)
              dggjvy08a5sw8 select c.user_name, c.sid,c.sql_id, sql.sql_te
              5kwbz1npr2cn3 select * from v$open_cursor where sid = 266
              gpfqfy1ytzc36 SELECT UPDTOP FROM YT_UPDTOP WHERE UPPER(KENNU
              25b9ahdjtmu4d SELECT c.USER_name, c.sid,c.SQL_id, SQL.SQL_te

              SID SQL_ID PREV_SQL_ID
              ---------- ------------- -------------
              266 9babjv8yq8ru3
              303 9babjv8yq8ru3
              313 87jg9w9ndsanm 9babjv8yq8ru3

              Comment


              • #8
                Hi,

                ich vermute Du verwendest sqlplus - welches selbst wiederum diverse SQLs im Hintergrund absetzt.

                Versuch mal den sqldeveloper/Toad die arbeiten nicht soviel im Hintergrund. Alternativ kannst Du auch die ganzen SET Optionen auf off setzen.

                Dim
                Zitat Tom Kyte:
                I have a simple philosophy when it comes to the Oracle Database: you can treat it as a black box and just stick data into it, or you can understand how it works and exploit it as a powerful computing environment.

                Comment

                Working...
                X