Oracle Session Parameter per JDBC?

AMiGA

Bekanntes Mitglied
Hallo,

ich habe per JDBC eine Verbindung zu einer Oracle Datenbank hergestellt. Beim Öffnen der Verbindung kann man ja Sitzungsparameter setzen:

Java:
StringBuffer url = new StringBuffer();

url.append("jdbc:oracle:thin:");
url.append("@" + hostName);
url.append(":" + port + ":");
url.append(databaseName);

Properties props = new Properties();
props.put("v$session.program", "Programmname");

DriverManager.getConnection(url, props);

Ist dies auch während einer Sitzung irgendwie möglich? Ich würde gerne direkt vor einem (Delete-) Statement einen Sitzungsparameter setzen.

Hintergrund ist, dass beim Ausführen des Delete-Statements ein Trigger angestoßen wird, der den Datensatz vor dem Löschen in eine Historien-Tabelle schreibt. Beim Löschen wird aber nicht der (Applikations-) Benutzer im Datensatz aktualisiert, so dass ich diesen Wert gerne per Sitzungsparameter an Oracle weiterreichen würde, so dass der Trigger ihn dann auswerten und beim Wegschreiben setzen kann.

Gruß,
AMiGA
 

MrWhite

Bekanntes Mitglied
Klar geht das:

Nativen Query der Form

Code:
ALTER SESSION ...

absetzen.

Macht man gerne mit Optimizern z.B.

Der rulebased Optimizer ist naemlich wesentlich performanter bei kaskadierten Views und anderen Scherzen.
 

AMiGA

Bekanntes Mitglied
Okay, also mit
Code:
ALTER SESSION SET parameter = value
kann ich Parameterwerte setzen, das ist schon mal gut, danke.

Kann ich denn auch eigene Parameter definieren oder kann ich irgendeinen Oracle-Parameter für meinen Wert missbrauchen?

Der rulebased Optimizer ist naemlich wesentlich performanter bei kaskadierten Views und anderen Scherzen.
Also ist
Code:
alter session set optimizer_mode=RULE
heute immer noch üblich? Ich dachte, dass das seit Oracle 10 keine Auswirkungen mehr hat weil Oracle Statements selbstständig optimiert.

Gruß,
AMiGA
 

MrWhite

Bekanntes Mitglied
Okay, also mit
Code:
ALTER SESSION SET parameter = value
kann ich Parameterwerte setzen, das ist schon mal gut, danke.

Kann ich denn auch eigene Parameter definieren oder kann ich irgendeinen Oracle-Parameter für meinen Wert missbrauchen?

Hmm, spontan würde ich dir raten, ein Package anzulegen und dort die Variable zu deklarieren. Beim Starten der Applikation kannst du dort deinen User reinschreiben und die Trigger können es dort rauslesen. Öffentliche Variablen in Packages sind im Session-Scope;

Alles andere funktioniert nur mit SQL+, denke ich.


Also ist
Code:
alter session set optimizer_mode=RULE
heute immer noch üblich? Ich dachte, dass das seit Oracle 10 keine Auswirkungen mehr hat weil Oracle Statements selbstständig optimiert.

Aber hallo! Gib dir mal Explain-Pläne mit der rulebased optimization aus. Die sind gerade unter 10g oft wesentlich performanter! Nach einer Migration auf 10g mussten wir da viele Selects mit der /*+ rule */ hint versehen, sonst wäre überhaupt nichts mehr gelaufen!
 

AMiGA

Bekanntes Mitglied
Leider klappt es immer noch nicht wie gewünscht. Folgendes habe ich gemacht:

Package angelegt:
Code:
CREATE PACKAGE MyPackage AS
   UsrName VARCHAR2(10);
   PROCEDURE setUsrName(param IN VARCHAR2);
   FUNCTION getUsrName RETURN VARCHAR2;
END MyPackage;

Package Body angelegt:
Code:
CREATE PACKAGE BODY MyPackage AS
   PROCEDURE setUsrName(param IN VARCHAR2) IS
   BEGIN
      UsrName := param;
   END;

   FUNCTION getUsrName RETURN VARCHAR2 IS
   BEGIN
      RETURN UsrName;
   END;
END MyPackage;

Wenn ich im SQL-Tool
Code:
EXECUTE MyPackage.setUsrName('NAME');
ausführe, ist alles in Ordnung. Ich kann den übergebenen Namen danach mit
Code:
SELECT MyPackage.getUsrName FROM DUAL;
wieder auslesen.

In meinem Java-Programm funktioniert es aber nicht:
Java:
Statement stmt = connection.createStatement();
stmt.execute("SELECT MyPackage.getUsrName FROM DUAL;");
stmt.close();
liefert mir java.sql.SQLSyntaxErrorException: ORA-00900: Ungültige SQL-Anweisung.

Was mache ich falsch?

Noch eine Frage zum Package: Das Package gilt nur auf Sitzungsebene? Das heißt, ich kann für jede Sitzung ein eigenes Package anlegen? Sobald die Sitzung beendet wird, verschwindet auch das Package wieder?

Gruß,
AMiGA
 
G

Gast2

Gast
Du darfst das ";" nicht mitgeben. Ausserdem musst du sicherstellen das das package überhaupt gefunden wird. Also du müsstest schon das Schema mit angeben oder ein PUBLIC Synonym verwenden.

Ehrlich gesagt ist das mit dem Package aber eher nicht der Weg den ich gehen würde. hast du dir mal ORACLE Contexte angesehn (sieh mein letzer Kommentar)? Das ist für genau so etwas gedacht.

Ein package "existiert" persistent. Wenn du einmal "CREATE OR REPLACE" gemacht hast gibt es das package bis es mit "DROP" entfernt wird.

Der Wert deiner Variablen gilt allerdings nur für die aktuelle Datenbank Session. Wenn du die Verbidnung schließt und wieder öffnest ist der Wert weg. Du kannst also in 5 sitzungen 5 mal die SET-Procedur mit unterschielidhcen Werten aufrufen.

Nebenbei - was macht deine Funktion wenn vorher nicht mit der Procedur ein Wert gesetzt wurde? Solltest du drauf achten.

Aber nochmal - schau die Contexte an ;)
 
Zuletzt bearbeitet von einem Moderator:

AMiGA

Bekanntes Mitglied
Aber nochmal - schau die Contexte an
Okay, danke. Ich hatte das zunächst nur überflogen, tut mir leid. Dabei hatte ich gesehen, dass auch dort Packages erzeugt werden und hatte vermutet, dass es noch eine Stufe komplexer ist. Sorry.

Folgendes habe ich nun angelegt:
Code:
CREATE CONTEXT MyContext USING MyPackage;

CREATE PACKAGE MyPackage AS
   PROCEDURE setValue(value IN VARCHAR2);
END MyPackage;

CREATE PACKAGE BODY MyPackage AS
   PROCEDURE setValue(value IN VARCHAR2) IS
   BEGIN
      dbms_session.set_context('MyContext', 'UsrName', value);
   END setValue;
END MyPackage;

Ein Aufruf von
Code:
exec MySchema.MyPackage.setValue('Test');
sowie
Code:
SELECT sys_context('MyContext', 'UsrName') FROM DUAL;
funktioniert im SQL-Tool wunderbar.

Von der Java-Anwendung aus funktioniert das Auslesen auch (mit dem Ergebnis NULL, ist ja in Ordnung). Das Setzen eines Wertes funktioniert leider immer noch nicht. Ich erhalte wieder eine java.sql.SQLSyntaxErrorException: ORA-00900: Ungültige SQL-Anweisung. Das Semikolon habe ich weggelassen. Auch der Aufruf mit ergänztem Schema schlägt fehl.

Ich bedanke mich schonmal für die Unterstützung!

Gruß,
AMiGA
 
G

Gast2

Gast
Du kannst nur Functionen in einem SELECT verwenden. Procedures musst du in einem anonymen PL/SQL Block aufrufen

Java:
   String sql  = "BEGIN ";
          sql += "  MySchema.MyPackage.setValue('Test'); ";
          sql += "END;";
 

AMiGA

Bekanntes Mitglied
Funktioniert perfekt, danke!

Edit: Um das ganze sauber zu programmieren, würde ich gerne programmtechnisch feststellen, ob der Context bzw. das Package in der DB überhaupt vorhanden ist. Leider habe ich da bislang noch keinen Weg gefunden.

In v$context werden wohl nur die bereits gesetzten Werte abgelegt. In DBA_SOURCE könnte ich nachschauen, ob das Package angelegt ist, da hat der DB-User aber normalerweise keine Rechte zu.

Gibt es einen View, wo man die Packages eines Users sehen kann?

Edit2: USER_OBJECTS scheint geeignet zu sein.

Gruß,
AMiGA
 
Zuletzt bearbeitet:
G

Gast2

Gast
Es gibt immer drei Views bei ORACLE. Das gilt für Objecte wie auch für privilegen, user (gut hiernicht, da sind es nur zwei) etc.
DBA
ALL
USER

z.B. DBA_OBJECTS, ALL_OBJECTS und USER_OBJECTS

Für einen Anwender oder Programmierer reicht meist ALL_OBJECTS und USER_OBJECTS
 

AMiGA

Bekanntes Mitglied
Für einen Anwender oder Programmierer reicht meist ALL_OBJECTS und USER_OBJECTS.
Okay, ich denke USER_OBJECTS ist das Richtige für mich.

Wie unter create context [Oracle] ganz unten zu lesen, besteht leider nicht die Möglichkeit, einen Kontext in einem bestimmten Schema anzulegen. Wenn ich mehrere Schemata in einer Datenbank habe und für jedes Schema den Kontext mit Package und Package Body erzeuge, erhalte ich beim Zugriff mittels dbms_session.set_context nun "ORA-01031 Nicht ausreichende Berechtigungen". Besteht irgendeine Möglichkeit, dies für verschiedene Schemata zu realisieren?

Kann ich per SQL im voraus abfragen, ob ich die benötigten Zugriffsrechte unter Oracle habe? Ansonsten müßte ich programmtechnisch die Exception abfangen, was eher unschön wäre.

Gruß,
AMiGA
 

AMiGA

Bekanntes Mitglied
Kann ich per SQL im voraus abfragen, ob ich die benötigten Zugriffsrechte unter Oracle habe?
Bislang habe ich leider noch nichts wirklich brauchbares gefunden. Die Rollen des angemeldeten Benutzers finde ich in USER_ROLE_PRIVS, die einzelnen Privilegien in SESSION_PRIVS. Ich weiß aber leider nicht, wie ich prüfen kann, ob der Kontext MyContext dem Package MySchema.MyPackage oder aber dem Package OtherSchema.MyPackage zugeordnet ist.

Ein Kontext für mehrere Schemata scheint ja leider nicht möglich zu sein. D.h. ich muss für jedes Schema auch einen eigenen Kontext anlegen, der dann auch anders benannt ist, da er ja im SYS-Schema abgelegt wird?

Gruß,
AMiGA
 
G

Gast2

Gast
Alle Priviliegen eines Benutzers verlässlich abfragen geht nur über einige DBA Views, ist aber auch nicht nötig. Was spricht denn dagegen es einfach mal auszuprobieren und die Exception abzufangen? Das ist doch genau der Sinn dahinter, in deinem Design solltest du die Datenbank soweit wie möglich abstrahieren.

Ob du jetzt ein Statement absetzt, das Resultset ausließt und dann entschließt das du Statement2 absetzten darfst oder gleich Statement2 abschießt ist doch egal, um genauzu sein eigentlich ist es sogar besser gleich Statement2 zu versuchen.

In einen [c]try [...] catch (SQLException)[/c] Block muss eh alles rein.

Mir erschließt sich noch nicht ganz was du vorhast? Wofür brauchst du für jedes Schema einen Kontext? Bist du dir über deine Applikationstruktur klar? Versuch mal zu umreißen was du eigentlich machen möchtes, ich denke das Design deiner (verteilten) Anwendung ist "verbesserungswürdig" <- nicht bös gemeint.
 

AMiGA

Bekanntes Mitglied
Mir erschließt sich noch nicht ganz was du vorhast? Wofür brauchst du für jedes Schema einen Kontext? Bist du dir über deine Applikationstruktur klar? Versuch mal zu umreißen was du eigentlich machen möchtes, ich denke das Design deiner (verteilten) Anwendung ist "verbesserungswürdig" <- nicht bös gemeint.
Oh sorry, hatte ich gar nichts zu gesagt. Grundsätzlich habe ich eine Applikation mit einem Schema und einem Kontext. Da wir auf den Entwicklerrechnern unter Umständen aber mehrere Projekte parallel entwickeln, haben wir dort entsprechend auch mehrere Schemata.

Ich werde es wohl so lösen, dass beim Start der Applikation der Kontext jeweils neu angelegt wird:

Code:
CREATE OR REPLACE CONTEXT MyContext USING MyPackage;
Dadurch hat die gestartete Applikation dann automatisch die erforderlichen Rechte.

Gruß,
AMiGA
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Das printen der Ausgabe des Oracle-SQL-Statements in der Java-Eclipse-Konsole funktioniert nicht Datenbankprogrammierung 6
S Den letzten Eintrag aus Datenbank ziehen (Oracle SQL Dev.) Datenbankprogrammierung 14
S Oracle DB-Connection in .jar file ändern Datenbankprogrammierung 11
D Oracle Gateway oder Relay-Server Datenbankprogrammierung 5
N Oracle SQL - Nächst kleineren Namen2 zu einem Namen aus einer Tabelle Datenbankprogrammierung 3
M Oracle SQL Zeitabstand in Tagen Datenbankprogrammierung 11
P Datenbank Tool - besser als oracle SQL Developer gesucht mit effizinte Verbindungsverwaltung Datenbankprogrammierung 2
X JPA (EclipseLink) und Oracle Datenbank Datenbankprogrammierung 2
H Oracle Resize eines Images in Java und Rückgabe des Image als BLOB an die Oracle Datebank Datenbankprogrammierung 14
H Java Class zum komprimieren von Jpeg-Images zum Einbinden in Oracle DB - Bild als blob (in und out) Datenbankprogrammierung 23
L Oracle Oracle Datumsspalte auslesen Datenbankprogrammierung 5
L Oracle Daten von Oracle zu MSSQL übertragen Datenbankprogrammierung 4
L LOAD DATA INFILE mit Oracle Datenbankprogrammierung 24
D Abfrage - Spalte(Datum) ändern (Oracle) Datenbankprogrammierung 7
L Oracle Datenbank über Java aufrufen Datenbankprogrammierung 29
R ERModel der Datebanken (ORACLE,MySQL,MS-SQL usw) Datenbankprogrammierung 4
I Datenbankverbindung Oracle DB klappt nicht - getConnection returned null Datenbankprogrammierung 8
R DB2 Oracle 12 - invalid username/passwort Datenbankprogrammierung 1
AssELAss Verbindung i5 Series 7.1 / 7.2 (DB2) mit Oracle SQL Developer Datenbankprogrammierung 3
C Von Oracle zu Couchbase Datenbankprogrammierung 1
E Was sind die Vorteile von DB2 im Gegensatz zu einer Oracle-Datenbank? Datenbankprogrammierung 5
R Oracle jdbc Zugriff auf Oracle Datenbankprogrammierung 2
B No suitable driver found for jdbc:oracle:thin:@$HOST:$PORT:$SID Datenbankprogrammierung 7
S Oracle Database 11g , eclipse , Tabelle erstellen Datenbankprogrammierung 2
0 JDBC Oracle Verbindungsaufbau Datenbankprogrammierung 6
Q Oracle Linux: ClassNotFoundException: oracle.jdbc.driver.OracleDriver Datenbankprogrammierung 6
F Oracle Oracle JDBC Anbindung unter Glassfish 3.1.2 Datenbankprogrammierung 3
P Oracle Hibernate - Oracle-VarChar-Index wird nicht genutzt Datenbankprogrammierung 3
Kenan89 Oracle passwortspalte Datenbankprogrammierung 2
Kenan89 Oracle Daten einer Tabelle in Array speichern Oracle Datenbankprogrammierung 10
S Problemme mit oracle Datenbankprogrammierung 13
H Oracle Hibernate + Oracle Datenbankprogrammierung 3
c_sidi90 JDBC Oracle Connection schlägt fehl Datenbankprogrammierung 2
D Oracle SQL Ergebnis anzeigen und Applet Fehlermeldung Datenbankprogrammierung 12
1 Java - Oracle Restore Point Datenbankprogrammierung 2
X Rollback mit Savepoint funktioniert auf Oracle nicht (ORA-01086) Datenbankprogrammierung 4
E Datenbankverbindung mit Oracle JDBC und Eclipse Plugin Quantum db Datenbankprogrammierung 2
M Kann Oracle Datenbanktreiber nicht laden Datenbankprogrammierung 5
F Performance-Tool für Oracle Datenbankprogrammierung 2
Dit_ Oracle Oracle DB | Installation Datenbankprogrammierung 3
T Datum anpassen in Oracle Datenbankprogrammierung 5
R Oracle Java -> Tomcat -> Oracle Datenbankprogrammierung 4
M Oracle Probleme mit dem anbinden einer Oracle 10g Datenbank Datenbankprogrammierung 27
H Oracle DBUnit/JUnit auf Oracle mit verschiedenen Schemata? Datenbankprogrammierung 8
G Stored Procedure in Oracle, Txt erzeugen Datenbankprogrammierung 9
G Oracle Zeile löschen Datenbankprogrammierung 2
G Auf Oracle Schema Name zugreifen Datenbankprogrammierung 7
G INSERT DATE in Oracle-DB Datenbankprogrammierung 11
J Oracle oder SQL-Server Datenbankprogrammierung 18
Z [ORACLE] Ausgabe Tabelle im GUI Datenbankprogrammierung 4
S Oracle Trigger Datenbankprogrammierung 5
cosmic Problem beim Update einer Oracle DB Datenbankprogrammierung 7
L JDBC Oracle Datenbankprogrammierung 2
N Oracle DB liefert nicht alle Datensätze Datenbankprogrammierung 3
H Oracle - Indizes werden nicht genommen Datenbankprogrammierung 6
P Probleme mit Oracle Timestamp Datenbankprogrammierung 3
A Loader-Dateien in Oracle Datenbankprogrammierung 4
G Oracle DB Link Datenbankprogrammierung 3
padde479 Connection String Oracle Datenbankprogrammierung 5
S Oracle Abfrage mit Platzhaltern Datenbankprogrammierung 3
D Oracle Datenbank exportieren Datenbankprogrammierung 3
Q admin tool für oracle datenbank - freeware Datenbankprogrammierung 7
G Blob aus Oracle-Datenbank Datenbankprogrammierung 2
J jdbc Oracle Connection refused Datenbankprogrammierung 6
S Oracle JDBC Treiber Problem Datenbankprogrammierung 4
J Bild in Oracle Datenbank - Grundkurs Datenbankprogrammierung 7
M Verbindung zu Oracle DB Datenbankprogrammierung 4
G Float Problem Java Oracle Datenbankprogrammierung 4
O Vector als Blob in Oracle Datenbank speichern Datenbankprogrammierung 3
O Oracle 11g wirft bei 90 % der installation eine Exception ? Datenbankprogrammierung 5
W ID des letzten eingefügten Werts ermitteln (Oracle) Datenbankprogrammierung 4
ARadauer Date Problem bei Oracle DB Datenbankprogrammierung 4
R oracle Anbindung geht im jar nicht Datenbankprogrammierung 8
D Insert Oracle BLOB Datenbankprogrammierung 1
O Oracle Client Software für ojdbc5! Datenbankprogrammierung 1
Y ORACLE - Autoincrement funktioniert nicht Datenbankprogrammierung 2
E Ein If und ein SELECT in Oracle? Datenbankprogrammierung 2
M Problem mit SUBSTR (Oracle) bzw. substring (Java) Datenbankprogrammierung 13
J Fehler bei Oracle-Datenbankverbindung Datenbankprogrammierung 2
E [SQL, Oracle] Zeile einfügen Datenbankprogrammierung 8
G Connection zu einer Oracle DB erstellen Datenbankprogrammierung 8
L Oracle: PL/SQL und Java Datenbankprogrammierung 3
K Oracle XE Connection Problem Datenbankprogrammierung 2
T INSERT-Befehl in Java für Oracle Datenbankprogrammierung 4
G Oracle-Record auslesen Datenbankprogrammierung 2
E JDBC Oracle Fehler, zugriff auf datenbank (Cluster) Datenbankprogrammierung 5
H Oracle - Partionierung von Tabellen Datenbankprogrammierung 4
H Oracle XE 10 mit Java Datenbankprogrammierung 4
B Oracle Driver Probleme Datenbankprogrammierung 2
R ResultSet liefert oracle.sql.TIMESTAMP, aber unbrauchbar Datenbankprogrammierung 9
thE_29 Speicherplatz von Oracle DB Datenbankprogrammierung 2
D Problem beim Zugriff auf eine Oracle-DB Datenbankprogrammierung 23
G Single Sign On bei Oracle Datenbankprogrammierung 3
E Jar File: NoClassDefFoundError: oracle/sql/ORAData Datenbankprogrammierung 2
H MIt oracle Verbinden (ungültiges Argument in Aufruf) Datenbankprogrammierung 4
W Wie auf Oracle zugreifen? Datenbankprogrammierung 3
R Oracle Express 10g mit JDBC Datenbankprogrammierung 3
N Wie kann ich mich mit Oracle verbinden? Datenbankprogrammierung 3
L oracle:ORA-01008: Nicht allen Variablen ist ein Wert zugeord Datenbankprogrammierung 1
G import Oracle.jdbc*; Datenbankprogrammierung 6

Ähnliche Java Themen

Neue Themen


Oben