来自 SAS 数据集的 Oracle 表

Posted

技术标签:

【中文标题】来自 SAS 数据集的 Oracle 表【英文标题】:Oracle table from SAS dataset 【发布时间】:2012-12-24 08:22:48 【问题描述】:

我试图从 SAS 数据集创建 Oracle 表。我在很多情况下都取得了成功,但被困在一个特定的数据集上。我在下面提供日志文件。我正在 Linux 上使用 SAS 9 和 Oracle 11.2.0.1.0。

有什么建议吗?

1          libname dibsdata "/data2/dibyendu/Jan_9/on_demand/";
NOTE: Libref DIBSDATA was successfully assigned as follows:
      Engine:        V9
      Physical Name: /data2/dibyendu/Jan_9/on_demand
2          libname myora oracle user=sasuser password=XXXXXXXXXX path=CIOEDATA ;
NOTE: Libref MYORA was successfully assigned as follows:
      Engine:        ORACLE
      Physical Name: CIOEDATA
3          data myora.on_demand;
4              set dibsdata.on_demand;
5          run;

NOTE: SAS variable labels, formats, and lengths are not written to DBMS tables.
ERROR: Error attempting to CREATE a DBMS table. ERROR: ORACLE execute error: ORA-00904: : invalid identifier..
NOTE: The DATA step has been abnormally terminated.
NOTE: The SAS System stopped processing this step because of errors.
NOTE: SAS set option OBS=0 and will continue to check statements. This might cause NOTE: No observations in data set.
WARNING: The data set MYORA.ON_DEMAND may be incomplete.  When this step was stopped there were 0 observations and 48 variables.
ERROR: ROLLBACK issued due to errors for data set MYORA.ON_DEMAND.DATA.
NOTE: DATA statement used (Total process time):
      real time           0.06 seconds
      cpu time            0.00 seconds


ERROR: Errors printed on page 1.
2                                                          The SAS System                           17:00 Wednesday, January 9, 2013


NOTE: SAS Institute Inc., SAS Campus Drive, Cary, NC USA 27513-2414
NOTE: The SAS System used:
      real time           1.24 seconds
      cpu time            0.04 seconds

【问题讨论】:

您的数据值似乎存在问题,不符合特定的 oracle 列约束?什么是 oracle 错误 ORA-00904? 尝试检查原始数据集中的某些变量的名称是否为 Oracle 上的保留字。 【参考方案1】:

Oracle 错误 ORA-00904 表示您正在尝试使用无效的列名创建表。您很可能有一个名称超过 30 个字符的 SAS 变量,或者是一个 Oracle 保留字。例如,这个 SAS 数据集中的两个变量在 Oracle 中是非法的:

data a;
  column_name_too_long_for_oracle = 1;
  date = today(); /* This is a reserved word */
run;

这里是the Oracle 11g Reserved Words list。检查 SAS 数据集中的变量名称,并将它们重命名为 Oracle 中的合法名称。例如,如果违规者是名为 DATE 的 SAS 变量,您可以尝试以下操作:

data myora.on_demand;
   set dibsdata.on_demand(rename=(DATE=PROJ_DATE));
run;

【讨论】:

非常感谢,dperetin 和 Bob Duell。我发现有一个名为“index”的变量,还有另一个名称异常长的变量。我重命名了这两个变量,这解决了问题。问候,

以上是关于来自 SAS 数据集的 Oracle 表的主要内容,如果未能解决你的问题,请参考以下文章

SAS 操作数据集的观测

如何使用 SAS 删除包含 SAS 数据集的外部文件夹

Lesson 1 数据集的建立

Sas程序优化使用较少的工作空间

SAS 对数据的拼接与串接

使用 #eval() 将来自单个数据集的多个表中的数据绑定到转发器