【问题标题】:Invalid DataType Error for Proc SQL QueryProc SQL 查询的无效数据类型错误
【发布时间】:2019-11-21 09:50:15
【问题描述】:

我正在使用 Oracle Pass Through 和宏循环创建一个基本查询。当我连接到 Oracle 时它工作正常,从连接创建表但是当我只是尝试使用 Oracle 的执行(DDL 语句)时,它给了我一个无效的数据类型错误。我不知道如何解决它。我只是从另一个现有表创建表。我正在为这个特定程序使用 SAS EG,但只是代码编辑器而不是查询生成器。

&STATES 宏解析为我创建的全局宏中的状态列表

我已经使用连接到 Oracle 成功编写了相同的查询,从连接传递方法创建表,但也希望仅使用执行方法来查看更有效的测试。但是,当我使用 execute 方法时,我得到了数据类型错误。

%let NUM=2;      
%let FT=LT;    
%let STATES=&&STATESR#  

PROC SQL;
connect to oracle(path=&mydb user=&USER pw=&PW);

%macro DTCNT() / parmbuff; 
%let i=1;
%let ST=%scan(&SYSPBUFF,&I);  

%do %while (%str(&ST)^=);

execute(CREATE TABLE TMSIS_&ST._&FT._HDR_ADJDT_CNTS1 (bulkload=yes dbcreate_table_opts=nologging) AS
         SELECT adj_date,
                count(*) as row_cnt 
         from mcd_r&NUM._own.&ST._&FT._header_f
         group by adj_date
         order by adj_date) by oracle;

execute (commit) by oracle;

      %let i=%eval(&I+1);  
      %let ST=%scan(&SYSPBUFF,&I);
      %end;
%mend DTCNT;
%DTCNT(&STATES);

disconnect from oracle;
QUIT;

错误:ORACLE 执行错误:ORA-00902:无效数据类型。

【问题讨论】:

    标签: oracle sas macros pass-through


    【解决方案1】:

    您正在使用 EXECUTE() 语句,因此里面的 SQL 需要是 Oracle 代码。 Oracle 不会理解 SAS 风格的数据集选项。您似乎要求创建一个名为 bulkload 的变量,其数据类型为 yes

    也许你的意思是这样的?

    execute(
      CREATE TABLE TMSIS_&ST._&FT._HDR_ADJDT_CNTS1 AS
      SELECT adj_date
           , count(*) as row_cnt
      from mcd_r&NUM._own.&ST._&FT._header_f
      group by adj_date
    ) by oracle;
    

    【讨论】:

    • 是的!做到了,谢谢!我没有意识到这是 SAS 特定的,现在它与以前的方法一起工作是有道理的,因为那是 SAS 语言,但不是在只能是 Oracle 的执行方法中。不知道为什么我以前没有尝试将其取出。那好吧。再次感谢!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-28
    • 1970-01-01
    • 2022-06-15
    • 1970-01-01
    • 2019-01-10
    相关资源
    最近更新 更多