我使用遊標將表CUT_CALENDAR中的所有記錄移動到SD_CALENDAR(日曆遷移)。我使用SQL Server上的以下光標這樣的:將Cursor語句從SQL Server轉換爲Oracle不起作用
DECLARE @sdCalendarId NUMERIC(20)
DECLARE @calendarTypId NUMERIC(5)
DECLARE @name NVARCHAR(35)
DECLARE @description NVARCHAR(255)
DECLARE @ptyId NUMERIC(20)
DECLARE @lockCode NVARCHAR(20)
DECLARE @dataOwnerId NUMERIC(20)
DECLARE @cntId NUMERIC(20)
DECLARE @nonBusinessDaysMonday CHAR(1)
DECLARE @nonBusinessDaysTuesday CHAR(1)
DECLARE @nonBusinessDaysWednesday CHAR(1)
DECLARE @nonBusinessDaysThursday CHAR(1)
DECLARE @nonBusinessDaysFriday CHAR(1)
DECLARE @nonBusinessDaysSaturday CHAR(1)
DECLARE @nonBusinessDaysSunday CHAR(1)
DECLARE @ccyId NUMERIC(20)
DECLARE @code NVARCHAR(30)
DECLARE @version NUMERIC(10)
DECLARE @seal VARCHAR(255)
DECLARE @lstUpdTs DATETIME
DECLARE cursorCutoffCalendar CURSOR FOR
SELECT ID, NAME, CALENDAR_TYP_ID,DESCRIPTION,'Y',PTY_ID,LOCK_CODE,DATA_OWNER_ID,CNT_ID,NON_BUSINESS_DAYS_MONDAY,NON_BUSINESS_DAYS_TUESDAY,NON_BUSINESS_DAYS_WEDNESDAY,NON_BUSINESS_DAYS_THURSDAY,NON_BUSINESS_DAYS_FRIDAY,NON_BUSINESS_DAYS_SATURDAY,NON_BUSINESS_DAYS_SUNDAY,CCY_ID,CODE,VERSION,SEAL,LST_UPD_TS
FROM CUT_CALENDAR
WHERE ID != 1
OPEN cursorCutoffCalendar
FETCH NEXT FROM cursorCutoffCalendar INTO @sdCalendarId, @calendarTypId, @name, @description, @ptyId, @lockCode, @dataOwnerId, @cntId, @nonBusinessDaysMonday, @nonBusinessDaysTuesday, @nonBusinessDaysWednesday, @nonBusinessDaysThursday, @nonBusinessDaysFriday, @nonBusinessDaysSaturday, @nonBusinessDaysSunday, @nonBusinessDaysMonday, @ccyId, @code, @version, @seal, @lstUpdTs
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @sdCalendarId = COALESCE(MAX(ID),1) FROM SD_CALENDAR
SET @sdCalendarId = @sdCalendarId + 1
INSERT INTO SD_CALENDAR (ID, NAME, CALENDAR_ROLE_ID,DESCRIPTION,USE_IN_CUTOFF,PTY_ID,LOCK_CODE,DATA_OWNER_ID,CNT_ID,NON_BUSINESS_DAYS_MONDAY,NON_BUSINESS_DAYS_TUESDAY,NON_BUSINESS_DAYS_WEDNESDAY,NON_BUSINESS_DAYS_THURSDAY,NON_BUSINESS_DAYS_FRIDAY,NON_BUSINESS_DAYS_SATURDAY,NON_BUSINESS_DAYS_SUNDAY,CCY_ID,CODE,VERSION,SEAL,LST_UPD_TS)
VALUES(@sdCalendarId, @name, @calendarTypId,@description,'Y',@ptyId,@lockCode,@dataOwnerId,@cntId,@nonBusinessDaysMonday,@nonBusinessDaysTuesday,@nonBusinessDaysWednesday,@nonBusinessDaysThursday,@nonBusinessDaysFriday,@nonBusinessDaysSaturday,@nonBusinessDaysSunday,@ccyId,@code,@version,@seal,@lstUpdTs)
END
CLOSE cursorCutoffCalendar
DEALLOCATE cursorCutoffCalendar
GO
因爲我也想支持Oracle體系結構,我想這SqlServer的光標轉換爲以下Oracle光標:
DECLARE v_sdCalendarId NUMERIC(20);
v_calendarTypId NUMERIC(5);
v_name VARCHAR2(35);
v_description VARCHAR2(255);
v_ptyId NUMERIC(20);
v_lockCode VARCHAR2(20);
v_dataOwnerId NUMERIC(20);
v_cntId NUMERIC(20);
v_nonBusinessDaysMonday CHAR(1);
v_nonBusinessDaysTuesday CHAR(1);
v_nonBusinessDaysWednesday CHAR(1);
v_nonBusinessDaysThursday CHAR(1);
v_nonBusinessDaysFriday CHAR(1);
v_nonBusinessDaysSaturday CHAR(1);
v_nonBusinessDaysSunday CHAR(1);
v_ccyId NUMERIC(20);
v_code VARCHAR2(30);
v_version NUMERIC(10);
v_seal VARCHAR(255);
v_lstUpdTs DATE;
CURSOR cursorCutoffCalendar IS
SELECT ID, NAME, CALENDAR_TYP_ID,DESCRIPTION,'Y',PTY_ID,LOCK_CODE,DATA_OWNER_ID,CNT_ID,NON_BUSINESS_DAYS_MONDAY,NON_BUSINESS_DAYS_TUESDAY,NON_BUSINESS_DAYS_WEDNESDAY,NON_BUSINESS_DAYS_THURSDAY,NON_BUSINESS_DAYS_FRIDAY,NON_BUSINESS_DAYS_SATURDAY,NON_BUSINESS_DAYS_SUNDAY,CCY_ID,CODE,VERSION,SEAL,LST_UPD_TS
FROM CUT_CALENDAR
WHERE ID != 1;
BEGIN
FOR calendar IN cursorCutoffCalendar
LOOP
SELECT COALESCE(MAX(ID),1) into v_sdCalendarId from SD_CALENDAR;
INSERT INTO SD_CALENDAR (ID, NAME, CALENDAR_ROLE_ID,DESCRIPTION,USE_IN_CUTOFF,PTY_ID,LOCK_CODE,DATA_OWNER_ID,CNT_ID,NON_BUSINESS_DAYS_MONDAY,NON_BUSINESS_DAYS_TUESDAY,NON_BUSINESS_DAYS_WEDNESDAY,NON_BUSINESS_DAYS_THURSDAY,NON_BUSINESS_DAYS_FRIDAY,NON_BUSINESS_DAYS_SATURDAY,NON_BUSINESS_DAYS_SUNDAY,CCY_ID,CODE,VERSION,SEAL,LST_UPD_TS)
VALUES(v_sdCalendarId, v_name, v_calendarTypId,v_description,'Y',v_ptyId,v_lockCode,v_dataOwnerId,v_cntId,v_nonBusinessDaysMonday,v_nonBusinessDaysTuesday,v_nonBusinessDaysWednesday,v_nonBusinessDaysThursday,v_nonBusinessDaysFriday,v_nonBusinessDaysSaturday,v_nonBusinessDaysSunday,v_ccyId,v_code,v_version,v_seal,v_lstUpdTs);
END LOOP;
CLOSE cursorCutoffCalendar;
END;
/
ORA-01001:無效光標ORA-06512:在第34行
我的oracle遊標腳本有什麼問題?
我又遇到一個新問題,我已經更新了我的答案,你能再檢查一次嗎? – Boerejef
@Boerejef從我上面的回答:'4。當你使用循環遊標時,你不需要明確地打開或關閉遊標。「...所以,刪除關閉遊標語句。出於好奇,爲什麼你仍然堅持使用循環遊標的方法,而不是使用單個插入語句? – Boneist