2016-01-05 4 views
0

Это, наверное, что-то глупое, что я уже смотрю.Создайте временную таблицу в триггере PL-SQL

У меня этот код в триггере. Полный триггер здесь: (Там больше кода выше этого кода) http://pastebin.com/KcBZdEmt

CREATE TABLE ApprList AS 
SELECT 
U.* 
FROM pmm$PmmReleaseRequest R 
INNER JOIN dbo$ManagedEntity ME 
ON ME.ManagedEntityID = R.ManagedSystemID 
INNER JOIN dbo$SmartRuleAssetCache SRC 
ON SRC.AssetID = ME.AssetID 
INNER JOIN dbo$UserGroup_SmartRule_Role GSR 
ON GSR.SmartRuleId = SRC.SmartRuleId 
AND GSR.RoleId IN (2,3) 
INNER JOIN dbo$AppUser_UserGroup UG 
ON UG.GroupID = GSR.UserGroupId 
AND UG.UserID <> R.UserID 
INNER JOIN dbo$AppUser U ON UG.UserID = U.UserID 
WHERE R.ReleaseRequestID = ReleaseRequestID 
AND U.UserID <> RequestorUserID; 

На феллинг линии:

CREATE TABLE ApprList AS 

я получаю:

Error(111,1): PLS-00103: Encountered the symbol "CREATE" when expecting one of the following:  (begin case declare end exception exit for goto if loop mod null pragma raise return select update while with <an identifier> <a double-quoted delimited-identifier> <a bind variable> << continue close current delete fetch lock insert open rollback savepoint set sql execute commit forall merge pipe purge 

Это, вероятно, лучше, чтобы взять пик в файле pastebin.

Заранее спасибо.

+0

Вы не можете создать таблицу внутри триггера без динамического SQL. Вам нужно «ВЫПОЛНИТЬ НЕМЕДЛЕННОЕ» CREATE .... » – Tatiana

+3

Вы даже не можете делать это динамически внутри триггера, потому что это неявно совершает, что запрещено. В вашем названии также указывается, что вы создаете временную таблицу, но ваш код предназначен для постоянной таблицы. Oracle не имеет локальных временных таблиц; вам нужна глобальная временная таблица, как показывает Кевинский. –

+1

Зачем вам это делать? –

ответ

3

Вы не можете смешивать заявления DDL и DML вместе без использования EXECUTE IMMEDIATE. Однако вся идея создания таблицы в триггере, в то время как отлично в SQL Server, не является лучшей практикой в ​​Oracle. Вместо этого используйте глобальную временную таблицу. Создайте эту таблицу, а затем вставить в него из trigger.Something как этот образец

CREATE GLOBAL TEMPORARY TABLE YourSchema.Yourtable 
-- Create table 

( 
    pk_id   NUMBER(9) NOT NULL, 
    company   VARCHAR2(20 VARCHAR2) not null, 
    voucher_type VARCHAR2(3 VARCHAR2) not null, 
    voucher_no  NUMBER(10) not null, 
    year_period_key NUMBER not null 
) 
on commit PRESERVE rows; 
+2

Это не просто не лучшая практика; вы не можете совершать внутри триггера, поэтому даже не можете выполнять динамический DDL, поскольку это неявно совершает. Вы получите ORA-04092, когда срабатывает триггер. (Думаю, у вас может быть автономная процедура, но ... нет, давайте не туда ...) –

Смежные вопросы