在Oracle过程中创建外部表

在Oracle过程中创建外部表,oracle,plsql,dynamic-sql,external-tables,Oracle,Plsql,Dynamic Sql,External Tables,我使用的是Oracle11g,在过程中创建外部表时遇到了问题。它创建时没有错误,但是当我执行过程时,我有错误 第一个参数是文件名,第二个参数是逗号,因为在指定以节结尾的字段时,在逗号周围使用单引号存在问题。已声明数据_DIR 这是我试过的 CREATE OR REPLACE PROCEDURE LOADTABLE ( FILENAME VARCHAR2, COMMA VARCHAR ) AS BEGIN EXECUTE IMMEDIATE 'CREATE TABLE L

我使用的是Oracle11g,在过程中创建外部表时遇到了问题。它创建时没有错误,但是当我执行过程时,我有错误

第一个参数是文件名,第二个参数是逗号,因为在指定以节结尾的字段时,在逗号周围使用单引号存在问题。已声明数据_DIR

这是我试过的

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;
这就是我所说的程序

EXEC LOADTABLE('username.csv',',');
这就是我得到的错误

ERROR at line 1:
ORA-00931: missing identifier
ORA-06512: at "DATA_ADMIN.LOADTABLE", line 9
ORA-06512: at line 1
任何帮助都将不胜感激。

您只能绑定变量,而外部表创建语法需要您尝试绑定的元素的文本文本

您将不得不使用串联:

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.
在这里,我对串联字符串值周围的单引号进行了转义。在你提到的问题中,你只传递逗号,因为你在使用单引号来包围逗号时遇到了问题;通过将它们加倍来对其进行转义是一种方法,因此,如果您总是希望使用逗号分隔符,您可以改为:

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');
然而,在飞行中创建和放置对象通常不是一个好主意。最好只创建一次外部表,这将通过静态DDL完成:

CREATE TABLE LOAD
(
  USERNAME VARCHAR2(30)
)
ORGANIZATION EXTERNAL
(
  TYPE ORACLE_LOADER
  DEFAULT DIRECTORY DATA_DIR
  ACCESS PARAMETERS
  (FIELDS TERMINATED BY ',')
  LOCATION ('dummy')
);
然后只需修改表,使其静态地具有新的文件名:

alter table load location ('username.csv');
或者,如果您确实需要一个过程来完成此操作:

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

EXEC LOADTABLE('username.csv');
您只能绑定变量,而外部表创建语法要求您尝试绑定的元素使用文本文本

您将不得不使用串联:

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.
在这里,我对串联字符串值周围的单引号进行了转义。在你提到的问题中,你只传递逗号,因为你在使用单引号来包围逗号时遇到了问题;通过将它们加倍来对其进行转义是一种方法,因此,如果您总是希望使用逗号分隔符,您可以改为:

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');
然而,在飞行中创建和放置对象通常不是一个好主意。最好只创建一次外部表,这将通过静态DDL完成:

CREATE TABLE LOAD
(
  USERNAME VARCHAR2(30)
)
ORGANIZATION EXTERNAL
(
  TYPE ORACLE_LOADER
  DEFAULT DIRECTORY DATA_DIR
  ACCESS PARAMETERS
  (FIELDS TERMINATED BY ',')
  LOCATION ('dummy')
);
然后只需修改表,使其静态地具有新的文件名:

alter table load location ('username.csv');
或者,如果您确实需要一个过程来完成此操作:

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

EXEC LOADTABLE('username.csv');

在上述情况下,我们正在改变表的位置。表中已存在旧记录,我们不再需要这些记录。为了避免这种情况,我们可以做什么..不确定位置更改与现有数据的关系,但无论如何,请提出一个新问题来解释您的问题。在上述情况下,我们将更改表位置。表中已存在旧记录,我们不再需要这些记录。为了避免这种情况,我们可以做什么..不确定位置更改与现有数据的关系,但无论如何,请提出一个新问题来解释您的问题。