ORA-00928: 缺少 SELECT 关键字,SQL 语句未传递到 DBMS,SAS 将进行处理

ORA-00928: missing SELECT keyword, SQL statement was not passed to the DBMS, SAS will do the processing

我对这段代码感到很沮丧。我一直在尝试使用 syspbuff 传递值。但是,我想传递多个值,但是对于我正在尝试执行的这个 UNION 代码,这给我带来了麻烦。我正从 Oracle 转到 SAS,我认为这是导致问题的原因,但我想知道原因。以前,我在 temp space (SAS) 中有源表,但我没有收到此错误。但是当我由于特定原因不得不在 MYDB (Oracle) 中创建表时,我开始收到带有 "failure to pass through" 错误的大日志。

有趣的是,该代码确实有效,并且它按照我的要求进行,但问题是我弹出一个日志,提示日志太大,将在外部打开。然后它打开一个巨大的文本文件并且有大量错误基本上说它无法通过代码进入隐式传递。我并没有试图通过这段特定的代码。所以,它再次起作用,我最终得到了我想要的,但日志问题让我发疯。

%macro ALLPROVTYPE() / parmbuff; 
    %do ii = 1 %to %sysfunc(countw(%bquote(&syspbuff.))); 
    %let FT=%scan(%bquote(&SYSPBUFF),&ii);  

CREATE TABLE MYSASLIB.ALLST_PROV_&FT._NULL AS
SELECT "AK" AS STATE,*
FROM MYDB.AK_PROV_&FT 

%macro JNSTS() / parmbuff; 
    %do i = 1 %to %sysfunc(countw(%bquote(&syspbuff.))); 
    %let ST=%scan(%bquote(&SYSPBUFF),&i); 

UNION CORR

SELECT "&ST" AS STATE,*
FROM MYDB.&ST._PROV_&FT

      %end;
%mend JNSTS;
%JNSTS(&&PROVALL&FT);
;
      %end;
%mend ALLPROVTYPE;

PROC SQL;
%ALLPROVTYPE(&PROVNUMS);
QUIT;

访问引擎:错误:ORACLE 准备错误:ORA-00928:缺少 SELECT 关键字。 SQL 语句:DEBUG:DBMS 引擎返回错误 - 无隐式直通。 调试:准备期间出错:

我理解这个查询的方式是,你正在创建多个 table,每个 table 被创建为一个 select 语句,它是通过多个 select 通过 UNION CORR 连接的语句。本质上是这样的:

create table <something> as
  (select <something> as state, * from <something> union corr 
   select <something> as state, * from <something> union corr
   select <something> as state, * from <something>);

这是正确的吗?

如果是,则您的宏代码存在一些语法上有问题的嵌套。试试下面的代码(虽然我无法完全验证它,因为我没有关于宏输入的信息):

/* Since this needs to be passed between the two macros */
%global FT;

%macro ALLPROVTYPE() / parmbuff;
    %do ii = 1 %to %sysfunc(countw(%bquote(&syspbuff.)));
        %let FT=%scan(%bquote(&SYSPBUFF),&ii);
        CREATE TABLE MYSASLIB.ALLST_PROV_&FT._NULL AS (
            %JNSTS(&&PROVALL&FT)
            );
    %end;
%mend;

%macro JNSTS() / parmbuff;
    %do jj = 1 %to %sysfunc(countw(%bquote(&syspbuff.)));
        %let ST=%scan(%bquote(&SYSPBUFF),&jj);
        SELECT "&ST" AS STATE,* FROM MYDB.&ST._PROV_&FT

        %if &jj NE %sysfunc(countw(%bquote(&syspbuff.))) %then
        %do;
            UNION CORR
        %end;
    %end;
%mend;

PROC SQL;
    %ALLPROVTYPE(&PROVNUMS);
QUIT;