У меня возникли трудности с созданием блока PL/SQL. Цель моего скрипта - вывести отчет на основе итогов последнего месяца в таблице (которая уже была создана как имя таблицы «countpull»). Я хочу использовать имя месяца в моем сценарии для создания таблицы, но Oracle возвращает ошибку «ORA-00900: неверный оператор SQL», указывая на команду CREATE TABLE ниже.Использование переменной в скрипте создания таблицы
DECLARE
curMonthChar NVARCHAR2(25);
curTableName NVARCHAR2(50);
tableexists NUMBER := 0;
BEGIN
SELECT TO_CHAR(ADD_MONTHS(sysdate,-1),'fmMONTH') INTO curMonthChar FROM DUAL;
SELECT ('QP17414_'||curMonthChar) INTO curTableName FROM DUAL;
--Check to see if current month's count table exists
SELECT COUNT(1) INTO tableexists FROM all_tab_columns WHERE OWNER = (SELECT USER FROM DUAL) AND table_name = curTableName;
--If current month's count table exists, drop it
IF tableexists > 0 THEN
EXECUTE IMMEDIATE 'DROP TABLE '||curTableName;
END IF;
--Create current month's count table
EXECUTE IMMEDIATE '
CREATE TABLE '||curTableName||' AS (
SELECT * FROM (
SELECT movetype, phone_flag, state FROM countpull
)
PIVOT (
COUNT(state)
FOR state IN ('''||'AA'||''','''||'AE'||''','''||'AK'||''','''||'AL'||'''
,'''||'AP'||''','''||'AR'||''','''||'AS'||''','''||'AZ'||''','''||'CA'||'''
,'''||'CO'||''','''||'CT'||''','''||'DC'||''','''||'DE'||''','''||'FL'||'''
,'''||'FM'||''','''||'GA'||''','''||'GU'||''','''||'HI'||''','''||'IA'||'''
,'''||'ID'||''','''||'IL'||''','''||'IN'||''','''||'KS'||''','''||'KY'||'''
,'''||'LA'||''','''||'MA'||''','''||'MD'||''','''||'ME'||''','''||'MH'||'''
,'''||'MI'||''','''||'MN'||''','''||'MO'||''','''||'MP'||''','''||'MS'||'''
,'''||'MT'||''','''||'NC'||''','''||'ND'||''','''||'NE'||''','''||'NH'||'''
,'''||'NJ'||''','''||'NM'||''','''||'NV'||''','''||'NY'||''','''||'OH'||'''
,'''||'OK'||''','''||'OR'||''','''||'PA'||''','''||'PR'||''','''||'PW'||'''
,'''||'RI'||''','''||'SC'||''','''||'SD'||''','''||'TN'||''','''||'TX'||'''
,'''||'UT'||''','''||'VA'||''','''||'VI'||''','''||'VT'||''','''||'WA'||'''
,'''||'WI'||''','''||'WV'||''','''||'WY'||''')
))';
END;
Сценарий выше отлично работает, когда я не пытаюсь использовать переменную для имени таблицы. Но так как я хочу, чтобы имя таблицы динамически менялось при каждом запуске скрипта, я хочу избежать использования статического имени.
Почему это недействительно для создания таблицы с именем динамической таблицы в блоке PL/SQL?
Дополнительная информация:
Схема таблицы для countpull является
state NVARCHAR2(2),
movetype NVARCHAR2(1),
phone_flag NVARCHAR2(1)
[manual] (http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/executeimmediate_statement.htm#LNPLS1201) не объясняет, почему он говорит только динамическую строку SQL «... должен быть CHAR, VARCHAR2 или CLOB. " –
@jonearles - thanks - У меня был этот раздел, открытый на другой вкладке, и он все еще не мог его увидеть. Я добавил ссылки doc для конкатенации, создавая общую динамическую строку 'nvarchar2', которая также не была сразу очевидна. –
Спасибо, Алекс, это была проблема. Это мой первый реальный набег на PL/SQL после переключения с SQL Server, поэтому мне стало немного поучиться.Конкатенация в моем стержне является результатом многих шагов, которые я предпринял, чтобы попытаться выяснить, что было «недействительным» в отношении моего SQL. Я думал, что я должен неправильно настроить поворот. Благодарим вас за упрощение предложений. Что касается использования nvarchar2, я должен это сделать, чтобы разработать утомленную дурную привычку не уделять достаточно пристального внимания использованию правильных типов данных для этой необходимости. – Emma