Недопустимая ошибка типа данных для Proc SQL Query - PullRequest
0 голосов
/ 11 июля 2019

Я создаю базовый запрос, используя Oracle Pass Through и макро-цикл.Это работало нормально, когда я подключался к Oracle, создавал таблицу из соединения, но когда я просто пытался использовать Oracle только для выполнения (DDL-операторы), он выдавал мне недопустимую ошибку типа данных.Я не уверен, как это исправить.Я просто создаю таблицы из другой существующей таблицы.Я использую SAS EG для этой конкретной программы, но только редактор кода, а не конструктор запросов.

Макрос & STATES преобразуется в список состояний в глобальном макросе, который я создал

Я успешно написал тот же запрос, используя соединение с Oracle, создаю таблицу из метода сквозного соединения, нохотелось бы также заставить его работать только с методом execute, чтобы увидеть тест, который более эффективен.Однако при использовании метода 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: недопустимый тип данных.

1 Ответ

2 голосов
/ 11 июля 2019

Вы используете оператор 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;
...