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

时间:2019-05-13 10:03:14

标签: database oracle nosql oracle-sqldeveloper external-tables

编辑:我解决了一些类路径问题,现在在执行“ SELECT *”时生成的日志文件中出现以下错误

  

UP-04004:读取文件/home/oracle/tweet-dataloc/nosql.dat时出错

     

KUP-04017:操作系统消息:错误0

     

KUP-04017:操作系统消息:/ home / oracle / processor / nosql_stream:第4行:java:没有这样的文件或目录

请注意,该文件完全在该路径中,并且具有777权限。编辑结束

我正在创建一个指向Oracle NoSQL数据库的外部表,该数据库将数据存储为键值对。

请注意,在此示例中,我将每个目录都放置在/ tmp中,所有操作系统级别的用户都可以访问该目录,因此我们消除了与操作系统权限相关的所有问题

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

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;

然后,我按如下所示创建表:

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

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

  

5月10日星期五08:16:34 +0000 2019 | 1126762942307811331 | RT @annknownityy:未来的医生,律师,工程师,医疗技术,护士,注册会计师,心理学家,外交官,生物学家,老师,建筑师在办公室里?美国梧桐女孩?|全国人均卡卢卡城|假| 85 | 190 | 0 | 7804 | 3131 | Sat Mar 21 00:09:46 +0000 2015 ||||||假| 0 | 0 | 0 | 0 |假| false | low | zh | 1557476194346

     

5月10日星期五08:16:34 +0000 2019 | 1126762943347953664 | University of   伊巴丹(UI)2018/2019学年学费时间表?   http somelink?学习   更多| OlusegunFapohunda |地球|假| 592 | 5 | 3 | 104 | 6851 | 2月11日星期四   21:49:57 +0000   2010 |||||| false | 0 | 0 | 0 | 0 | false | false | low | en | 1557476194594

     

5月10日星期五08:16:34 +0000 2019 | 1126762943498948609 | RT @ zinadabo1:请   我们需要帮助,我刚刚得知Rotimi Akeredolu增加了Ondo   州立大学的学费从35k到150k。

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

  

RA-29913:从ODCIEXTTABLEFETCH执行调用时出错

     

ORA-29400:数据记录错误

     

KUP-04004:读取文件/tmp/tweet-dataloc/nosql.dat时出错

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

1 个答案:

答案 0 :(得分:0)

nosql_stream文件必须类似于:

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

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

这说明了为什么它是在12c部署的容器上工作的,因为它是“本机” Linux系统,并使用了这些变量;同时,无法通过本地SQL Developer正确访问这些文件,因此无法正确执行文件。