Выбор SQL и регистр в сочетании - PullRequest
2 голосов
/ 18 ноября 2011

У меня проблемы с оператором выбора, и я не уверен, что делаю неправильно.Это структура исходной таблицы:

Исходная схема DATA1

Исходная таблица FOLDERS

Исходные столбцы FOLDERID, USERID

Схема назначения DATA1

Таблица назначения FOLDER_USER

Назначение столбцов FOLDER_ID, USER_ID

И вот запрос (мне нужно изменить идентификатор папки, когда она извлекается изпервый запрос, следовательно, случай):

DECLARE
BEGIN
   FOR FOLDER_ROW IN (SELECT FOLDERID = CASE 
                                WHEN FOLDERID = '10' THEN '1'
                                WHEN FOLDERID = '565' THEN '2'
                                WHEN FOLDERID = '11' THEN '3'
                                WHEN FOLDERID = '81' THEN '4'
                                ELSE '0'
                            END, USERID FROM DATA1.FOLDERS WHERE UPPER(OWNER) = 'ADMIN')
      LOOP                       
          INSERT INTO DATA1.FOLDER_USER (FOLDER_ID, CORP_ID) VALUES (FOLDER_ROW.FOLDERID, FOLDER_ROW.CORPID);
     END LOOP;
    COMMIT;
END;

При выполнении я получаю следующую ошибку, и я застрял в том, почему я ее получаю.Я знаю, что это как-то связано с кейсом внутри select:

ORA-06550: line 3, column 39:
PL/SQL: ORA-00923: FROM keyword not found where expected
ORA-06550: line 3, column 22:
PL/SQL: SQL Statement ignored

Ответы [ 4 ]

3 голосов
/ 18 ноября 2011

Похоже, вы просто хотите

BEGIN
   FOR FOLDER_ROW IN (SELECT CASE 
                                WHEN FOLDERID = '10' THEN '1'
                                WHEN FOLDERID = '565' THEN '2'
                                WHEN FOLDERID = '11' THEN '3'
                                WHEN FOLDERID = '81' THEN '4'
                                ELSE '0'
                            END folder_id, 
                            USERID 
                       FROM DATA1.FOLDERS 
                     WHERE UPPER(OWNER) = 'ADMIN')
      LOOP                       
          INSERT INTO DATA1.FOLDER_USER (FOLDER_ID, CORP_ID) VALUES (FOLDER_ROW.FOLDER_ID, FOLDER_ROW.CORPID);
     END LOOP;
    COMMIT;
END;

Я добавил псевдоним FOLDER_ID в оператор CASE и исключил бит FOLDERID = из CASE

3 голосов
/ 18 ноября 2011

SELECT FOLDERID = CASE неверен. Это должен быть SELECT CASE ..... END As FOLDERID

1 голос
/ 18 ноября 2011

Я не уверен, что вы упростили свой код или нет перед публикацией вопроса, но я бы хотел полностью избавиться от цикла CURSOR FOR и просто использовать оператор INSERT с подзапросом.

Я думаю, что циклы CURSOR FOR довольно хорошо оптимизированы Oracle, поэтому они не могут работать быстрее, но их легче понять.

BEGIN
  INSERT INTO DATA1.FOLDER_USER (FOLDER_ID, CORP_ID) 
  SELECT 
    CASE 
      WHEN FOLDERID = '10' THEN '1'
      WHEN FOLDERID = '565' THEN '2'
      WHEN FOLDERID = '11' THEN '3'
      WHEN FOLDERID = '81' THEN '4'
      ELSE '0'
    END folder_id, 
    USERID 
  FROM DATA1.FOLDERS 
  WHERE UPPER(OWNER) = 'ADMIN';

  COMMIT;
END;
1 голос
/ 18 ноября 2011

Вы также можете переписать его как decode (хотя он менее переносим и труднее для чтения)

DECLARE 
BEGIN    
    FOR folder_row IN (SELECT DECODE(folderid,'10', '1','565','2','11', '3','81', '4','0') AS folderid , 
                              userid 
                       FROM data1.folders 
                       WHERE UPPER(owner) = 'ADMIN')       
    LOOP                                  
        INSERT INTO data1.folder_user (folder_id, corp_id) VALUES (folder_row.folderid, folder_row.corpid);      
    END LOOP;     
    COMMIT; 
END; 

см .: http://download.oracle.com/docs/cd/B28359_01/server.111/b28286/functions042.htm

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...