Erstellen eines DB-link, wenn nicht innerhalb einer gespeicherten Prozedur
Ich versuche, code einer gespeicherten Prozedur in Oracle. Ich don ' T haben eine Tonne von Erfahrung mit ihm, und ich bin mit einem Problem. Das Ziel des Verfahrens ist es, die Daten aus einer DB und setzen es in ein anderes in einer anderen form. Ich habe die meisten Verfahren arbeiten, es scheint aber habe ich Probleme mit etwas, das scheint, wie es sollte einfach sein. Am Anfang des Codes, ich möchte überprüfen, um sicherzustellen, dass ein DB-link angelegt. Wenn nicht, dann möchte ich zum erstellen der db-link.
Dies ist, was ich innerhalb meiner Prozedur:
IF (select count(1) from ALL_DB_LINKS where db_link = 'DB_LINK.NAME.COM') = 0 THEN
CREATE DATABASE LINK LINK_NAME
CONNECT TO username IDENTIFIED BY password
USING 'SID';
END IF;
Ich weiß, der link funktioniert, weil ich habe es getan, außerhalb dieser und habe eine Suche für Sie. Den Fehler bekomme ich wenn ich versuche zu kompilieren, ist dies:
Stießen auf das symbol "ERSTELLEN", wenn Sie erwarten eine der folgenden Optionen:
Ich habe all das getan, googeln ich denke, ich kann tun und ich kann nicht herausfinden, was ich falsch mache. Kopf ab, die andere Frage habe ich, ich habe auch versucht, es zu tun, indem Sie:
ERKLÄREN test_count Anzahl;
select count(1) into test_count from ALL_DB_LINKS where db_link = 'DB_LINK.NAME.COM';
BEGIN
IF test_count = 0 THEN
CREATE DATABASE LINK LINK_NAME
CONNECT TO username IDENTIFIED BY password
USING 'SID';
END IF;
END;
Aber ich bekomme den gleichen Fehler. Ich bin mir auch nicht sicher, wenn mit a beginnen inside a beginnen wird zu arbeiten. Jede Hilfe wäre eine große... naja, helfen.
- Sie können nicht tun, DDL-direkt innerhalb einer Prozedur in Oracle. Sie können dies umgehen, indem mit
EXECUTE IMMEDIATE
. - Ich denke, Sie würde auch mit dynamischen SQL Abfragen über den link; ich kann das nicht testen jetzt, aber ich bin mir ziemlich sicher, das Verfahren wird nicht kompiliert, wenn Sie die Auswahl aus einem link, der nicht vorhanden ist in der statischen SQL-und für ungültig erklärt werden, wenn es später gelöscht. Erstellen von Objekten zur Laufzeit klingt wie etwas, möchten Sie vielleicht zu überdenken...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Oracle kompiliert Pakete und um das zu tun, dass alle Objekte im code verwiesen wird, müssen bereits existieren. Dies beinhaltet die Objekte referenziert, die über einen Datenbank-link. Es wird als ungültig gekennzeichnet, wenn die referenzierten Objekte nicht existieren. In der Regel ein DBA wird das erstellen und pflegen einer solchen Umgebung mit PL/SQL-Skripts und nicht gespeicherte Prozeduren.
Wenn Sie wirklich wollen, sowieso:
Wenn Sie wirklich brauchen, um dies zu tun, können Sie die Verknüpfung erstellen-mit dynamischen SQL als Ed Gibbs vorgeschlagen, und Brian zeigte, wie lange der link schon vorhanden ist an der Stelle die Prozedur erstellt wird:
Aber das Verfahren wird nicht kompiliert, wenn die Verbindung nicht bereits vorhanden ist:
Neugierig es nicht-Objekt, wenn Sie die Prozedur erstellen, während die Verbindung besteht, und dann den link löschen; das Verfahren bleibt gültig, wird die dynamische SQL funktioniert so erstellen Sie die Verknüpfung, und das Verfahren läuft erfolgreich:
Hätte ich erwartet fallenlassen der link zu entkräften, das Verfahren aber offenbar nicht, obwohl Ihr erscheinen in
all_dependencies
. Sie können nicht kompilieren Sie die Prozedur jedoch:Damit Sie kompilieren (oder kompilieren), während der link nicht vorhanden ist, müssten Sie die Referenz-link mit dynamischen SQL als auch: