Oracle 数据库外部 table 问题。 ORA-29913、ORA-29400 和 KUP-04004

Oracle Database external table issue. ORA-29913, ORA-29400, and KUP-04004

编辑:我解决了一些类路径问题,现在我在执行 "SELECT *"

时生成的日志文件中收到以下错误

UP-04004: error reading file /home/oracle/tweet-dataloc/nosql.dat

KUP-04017: Operating system message: Error 0

KUP-04017: operating system message: /home/oracle/processor/nosql_stream: line 4: java: No such file or directory

请注意,该文件恰好位于该路径中,并且具有 777 权限。编辑结束

我正在制作一个外部 table 指向 Oracle NoSQL 数据库,其中数据存储为键值对。

请注意,对于此示例,我将所有 OS 级别的用户都可以访问的目录放在 /tmp 中,因此我们消除了任何 OS 权限相关的问题

首先,我在 SQL developer 中创建了两个虚拟目录,向我的用户 (nosqluser) 授予权限,当然,还创建了外部 table:

CREATE DIRECTORY ext_tab AS '/tmp/tweet-dataloc';
CREATE DIRECTORY nosql_bin_dir AS '/tmp/processor';
GRANT READ, WRITE ON DIRECTORY ext_tab TO nosqluser;
GRANT READ, EXECUTE ON DIRECTORY nosql_bin_dir TO nosqluser;

然后,我创建 table 如下:

CREATE TABLE "NOSQLUSER"."TWEETS3" 


("CREATED_AT" VARCHAR2(80 BYTE), 
    "ID_STR" VARCHAR2(80 BYTE), 
    "TEXT" VARCHAR2(200 BYTE), 
    "NAME" VARCHAR2(80 BYTE), 
    "LOCATION" VARCHAR2(80 BYTE), 
    "VERIFIED" VARCHAR2(80 BYTE), 
    "FOLLOWERS_COUNT" NUMBER, 
    "FRIENDS_COUNT" NUMBER, 
    "LISTED_COUNT" NUMBER, 
    "FAVOURITES_COUNT" NUMBER, 
    "STATUSES_COUNT" NUMBER, 
    "CREATED_AT_USER" VARCHAR2(80 BYTE), 
    "COUNTRY" VARCHAR2(80 BYTE), 
    "COUNTRY_CODE" VARCHAR2(80 BYTE), 
    "FULL_NAME_PLACE" VARCHAR2(80 BYTE), 
    "NAME_PLACE" VARCHAR2(80 BYTE), 
    "PLACE_TYPE" VARCHAR2(80 BYTE), 
    "IS_QUOTE_STATUS" VARCHAR2(80 BYTE), 
    "QUOTE_COUNT" NUMBER, 
    "REPLY_COUNT" NUMBER, 
    "FAVORITE_COUNT" NUMBER, 
    "RETWEET_COUNT" NUMBER, 
    "FAVORITED" VARCHAR2(80 BYTE), 
    "RETWEETED" VARCHAR2(80 BYTE), 
    "FILTER_LEVEL" VARCHAR2(80 BYTE), 
    "LANG" VARCHAR2(80 BYTE), 
    "TIMESTAMP_MS" VARCHAR2(80 BYTE)
   ) 
   ORGANIZATION EXTERNAL( 
      TYPE ORACLE_LOADER
      DEFAULT DIRECTORY "EXT_TAB2"
      ACCESS PARAMETERS( 
          records delimited by newline
          preprocessor nosql_bin_dir2:'nosql_stream'
          fields terminated by '|' 
          missing field values are null 
          reject rows with all null fields 
      )
      LOCATION ('nosql.dat')
    )
   REJECT LIMIT UNLIMITED ;

最后,我向您展示了我的 nosql_stream 脚本和 nosql.dat 文件的样子: /tmp/processor/nosql_stream:

#!/bin/bash
export PATH=$PATH:/usr/java/latest/bin
export CLASSPATH=/home/oracle/processor/*
java oracle.kv.exttab.Preproc $*

/tmp/tweet-dataloc/nosql.dat:

<config version="1">
  <component name="publish" type="params" validate="true">
    <property name="oracle.kv.exttab.connection.url" value="jdbc:oracle:thin:/@//relacional:1521/ORCLPDB1.localdomain" type="STRING"/>
    <property name="oracle.kv.exttab.connection.user" value="nosqluser" type="STRING"/>
    <property name="oracle.kv.exttab.tableName" value="nosqluser.tweets2" type="STRING"/>
  </component>
  <component name="nosql_stream" type="params" validate="true">
    <property name="oracle.kv.exttab.externalTableFileNumber" value="0" type="INT"/>
    <property name="oracle.kv.exttab.totalExternalTableFiles" value="1" type="INT"/>
    <property name="oracle.kv.formatterClass" value="formatter.TweetFormatter" type="STRING"/>
    <property name="oracle.kv.hosts" value="bequi_kvlite_1:5000" type="STRING"/>
    <property name="oracle.kv.kvstore" value="kvstore" type="STRING"/>
  </component>
</config>

最后一个文件是通过在 NoSQL 数据库端执行的发布功能生成的。您可以按照流程here

现在,问题 即使记录的处理方式与您在此处看到的一样:

Fri May 10 08:16:34 +0000 2019|1126762942307811331|RT @annknownityy: Future doctor, lawyer, engineer, med tech, nurse, cpa, psychologist, diplomat, biologist, teacher, architect, in the offi?|Sycamore Girl?|Caloocan City, National Capita|false|85|190|0|7804|3131|Sat Mar 21 00:09:46 +0000 2015||||||false|0|0|0|0|false|false|low|en|1557476194346

Fri May 10 08:16:34 +0000 2019|1126762943347953664|University of Ibadan (UI) School Fees Schedule for 2018/2019 Academic Session ? http somelink ? Learn More|OlusegunFapohunda|Earth|false|592|5|3|104|6851|Thu Feb 11 21:49:57 +0000 2010||||||false|0|0|0|0|false|false|low|en|1557476194594

Fri May 10 08:16:34 +0000 2019|1126762943498948609|RT @zinadabo1: Pls we need help, I was just informed that Rotimi Akeredolu increased Ondo state university tuition from 35k to150k.

无法访问数据。当我执行 "SELECT * FROM nosqluser.tweets3" 时,我得到的是:

RA-29913: error executing call from ODCIEXTTABLEFETCH

ORA-29400: error in data cartdrige

KUP-04004: error reading the file /tmp/tweet-dataloc/nosql.dat

由于显示了寄存器,我知道 NoSQL 数据库可以访问,并且数据已格式化并正确读取。事实上,到这里这个过程应该已经完成​​了,那么为什么我不能访问我的数据呢?

nosql_stream 文件必须如下所示:

#!/bin/bash
$JAVA_HOME/bin/java oracle.kv.exttab.Preproc $*

换句话说,即使在环境变量或 .bashrc 文件中已经指定了 nosql_stream,也必须指定 Java。

这解释了为什么它在部署 12c 的容器上工作,因为它是一个 "native" Linux 系统并使用这些变量;同时通过本地 SQL Developer 无法正常访问,导致文件无法正常执行。