2017-04-07 4 views
0

Ich verwende Oracle 11g und ich habe Probleme mit dem Erstellen einer externen Tabelle in einer Prozedur. Es wird ohne Fehler erstellt, aber wenn ich die Prozedur ausführe, habe ich Fehler.Erstellen von externen Tabellen in Oracle-Prozedur

Der erste Parameter ist der Name der Datei und der zweite ist ein Komma, weil ich Probleme mit der Verwendung von einzelnen Zitaten hatte, um das Komma zu umgeben, wo ich die Felder durch Abschnitt angegeben. DATA_DIR wurde deklariert.

Folgendes habe ich ausprobiert.

CREATE OR REPLACE PROCEDURE LOADTABLE 
(
    FILENAME VARCHAR2, 
    COMMA VARCHAR 
) 
AS 
BEGIN 

    EXECUTE IMMEDIATE 'CREATE TABLE LOAD 
    (
     USERNAME VARCHAR2(30) 
    ) 
    ORGANIZATION EXTERNAL 
    (
     TYPE ORACLE_LOADER 
     DEFAULT DIRECTORY DATA_DIR 
     ACCESS PARAMETERS 
     (FIELDS TERMINATED BY :COMMA) 
     LOCATION (:FILENAME) 
    )' USING IN COMMA, FILENAME; 
END; 

Dies ist, wie ich das Verfahren

EXEC LOADTABLE('username.csv',','); 

nennen Dies ist der Fehler ich

ERROR at line 1: 
ORA-00931: missing identifier 
ORA-06512: at "DATA_ADMIN.LOADTABLE", line 9 
ORA-06512: at line 1 

Jede Hilfe geschätzt wird erhalten.

Antwort

2

Sie können nur Variablen binden, und die externe Tabellenerstellungssyntax erfordert Textliterale für die Elemente, die Sie zu binden versuchen.

Sie werden Verkettung haben stattdessen verwenden:

CREATE OR REPLACE PROCEDURE LOADTABLE 
(
    FILENAME VARCHAR2, 
    COMMA VARCHAR 
) 
AS 
BEGIN 
    EXECUTE IMMEDIATE 'CREATE TABLE LOAD 
(
    USERNAME VARCHAR2(30) 
) 
ORGANIZATION EXTERNAL 
(
    TYPE ORACLE_LOADER 
    DEFAULT DIRECTORY DATA_DIR 
    ACCESS PARAMETERS 
    (FIELDS TERMINATED BY ''' || COMMA || ''') 
    LOCATION (''' || FILENAME || ''') 
)'; 
END; 
/

Procedure LOADTABLE compiled 

EXEC LOADTABLE('username.csv',','); 

PL/SQL procedure successfully completed. 

Indem ich die einfachen Anführungszeichen um die verketteten String-Werte entgangen haben. In der Frage, die du erwähnt hast, gibst du nur das Komma weiter, weil du "Schwierigkeiten damit hattest, einzelne Zitate zu verwenden, um das Komma zu umgeben"; sie zu entkommen, indem sie sie zu verdoppeln ist die Art und Weise, das zu tun, wenn Sie also immer noch eine Kommaseparator möchten, können Sie stattdessen tun:

CREATE OR REPLACE PROCEDURE LOADTABLE 
(
    FILENAME VARCHAR2 
) 
AS 
BEGIN 
    EXECUTE IMMEDIATE 'CREATE TABLE LOAD 
(
    USERNAME VARCHAR2(30) 
) 
ORGANIZATION EXTERNAL 
(
    TYPE ORACLE_LOADER 
    DEFAULT DIRECTORY DATA_DIR 
    ACCESS PARAMETERS 
    (FIELDS TERMINATED BY '','') 
    LOCATION (''' || FILENAME || ''') 
)'; 
END; 
/

EXEC LOADTABLE('username.csv'); 

jedoch zu schaffen (und fallen vermutlich) Objekte auf die Fliege nicht allgemein ist eine gute Idee. Es wäre besser, wenn die externe Tabelle zu erstellen, die mit statischen DDL erfolgen würde:

CREATE TABLE LOAD 
(
    USERNAME VARCHAR2(30) 
) 
ORGANIZATION EXTERNAL 
(
    TYPE ORACLE_LOADER 
    DEFAULT DIRECTORY DATA_DIR 
    ACCESS PARAMETERS 
    (FIELDS TERMINATED BY ',') 
    LOCATION ('dummy') 
); 

und dann ändern Sie einfach die Tabelle einen neuen Dateinamen statisch zu haben:

alter table load location ('username.csv'); 

oder wenn Sie möchten wirklich eine Prozedur, um es zu tun:

CREATE OR REPLACE PROCEDURE LOADTABLE 
(
    FILENAME VARCHAR2 
) 
AS 
BEGIN 
    EXECUTE IMMEDIATE 'ALTER TABLE LOAD LOCATION (''' || FILENAME || ''')'; 
END; 
/

EXEC LOADTABLE('username.csv'); 
Verwandte Themen