I would like to create a cursor on a conditional variable, the following is a short snippet:
DECLARE
@my_var VARCHAR(8)
SET @my_var = (some value is obtained and set for @myvar)
DECLARE my_cursor CURSOR FOR
SELECT
my_cols
FROM
my_table
WHERE
some_col < @my_var
I need the condition obtained from the variable @my_var before declaring the cursor, but Sybase complains that DECLARE CURSOR must be in it’s own batch. However, if I place a GO before DECLARE CURSOR then the variable @my_var will be out of scope.
How can I resolve this scoping issue?
Portion of code causing the problem:
DECLARE
@threshold_date VARCHAR(8),
@retain_period INT
SET @retain_period =
(
SELECT
RETAIN_PERIOD
FROM
ARCHIVE_RETAIN_PERIOD
)
IF(@retain_period > 0)
SET @retain_period = @retain_period * -1
SET @threshold_date = CONVERT(VARCHAR(8), DATEADD(DAY, @retain_period, GETDATE()), 112)
DECLARE archive_cursor CURSOR FOR
SELECT
TIMESTAMP,
TIMESTAMP_GRP,
CL_ORDER_ID,
CL_ORDER_GROUP_ID,
CL_PARENT_CHILD,
CL_PARENT_ORDER_ID,
CL_NUM_CHILDREN,
CL_PRIMARY_STATE,
CL_SECONDARY_STATE,
CL_PENDING_CHANGE,
CL_QUANTITY_FILLED,
CL_QUANTITY_FILLED_HOUSE,
CL_QUANTITY_FILLED_BROKER,
CL_QUANTITY_FILLED_CLIENT,
CL_QUANTITY_REMAINING,
CL_NUM_EXECUTIONS,
CL_CHILD_QUANTITY,
CL_CHILD_QUANTITY_REMAINING,
CL_GROSS_AVG_PRICE,
CL_GROSS_AVG_PRICE_HOUSE,
CL_GROSS_AVG_PRICE_BROKER,
CL_QUANTITY_BOOKED,
CL_BOOKING_PRICE,
COMPLETION_REASON,
COMMISSION,
SALES_CREDIT,
MARKUP,
ROUTED_COUNTERPARTY_ID,
CURRENT_EXECUTOR_ID,
LAST_EXECUTOR_ID,
RETAINED_EXECUTOR_ID,
ROUTED_TO,
RETAINED_SERVICE_ID,
UPDATE_COUNT,
UPDATE_USER,
UPDATE_DATE,
TRADER_MANAGED
FROM
my_db
WHERE
TIMESTAMP < @threshold_date
AND
CL_PRIMARY_STATE = "C"
GO
This one spot makes me wonder a bit:
Thinking it might need to be
That could be confusing things and giving you the error message.
EDIT Learning something new every day: A multi-line IF-THEN must end in a two-word END IF in Sybase :