0

条件変数にカーソルを作成したいと思います。以下は短いスニペットです。

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

カーソルを宣言する前に変数から条件を取得する必要がありますが、Sybase は独自のバッチ内になければならないと@my_var文句を言います。DECLARE CURSORただし、GO前にa を配置するとDECLARE CURSOR、変数@my_varはスコープ外になります。

このスコープの問題を解決するにはどうすればよいですか?

問題の原因となっているコードの一部:

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
4

2 に答える 2

0

この1つのスポットは、私を少し不思議にさせます:

IF(@retain_period > 0)
    SET @retain_period = @retain_period * -1

それが必要かもしれないと考えて

IF @retain_period>0 THEN
    SET @retain_period=@retain_period *-1;
END IF

それは物事を混乱させ、エラーメッセージを表示する可能性があります.

編集毎日何か新しいことを学ぶ: Sybase では、複数行の IF-THEN は 2 語の END IF で終わる必要があります。

于 2012-08-31T20:47:02.893 に答える
0
SET @retain_period =
(
  SELECT
    ABS(RETAIN_PERIOD) * -1
  FROM
    ARCHIVE_RETAIN_PERIOD
)

ただ言って。

于 2012-08-31T20:55:36.727 に答える