【发布时间】:2016-06-08 08:57:29
【问题描述】:
我使用游标将所有记录从表 CUT_CALENDAR 移动到 SD_CALENDAR(日历迁移)。为此,我在 Sql Server 上使用以下光标:
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 光标脚本有什么问题?
【问题讨论】:
标签: sql-server oracle cursor