2016-11-24 13 views
0

Я пишу процедуру для динамического SQLSYBASE выполнить SQLStatement в процедуре

CREATE PROC ... 
AS 
DECLARE 
... 
BEGIN TRANSACTION migrate_uuid 
    ... 
    EXEC('DECLARE u_cursor CURSOR FOR SELECT * FROM ' || @table_name) 

    OPEN u_cursor 

    ... 

Я не могу открыть u_cursor. Я получаю сообщение:
«Курсор« u_cursor »не может быть использован, поскольку его невозможно найти. Возможно, либо он не был объявлен, либо недоступен в текущем контексте ».

Как исправить эту проблему?

Благодаря

ответ

0

В большинстве РСУБД код управляет EXEC (или его эквивалент) в своей собственной области. Любые переменные и дескрипторы, созданные в коде, выполняемом EXEC, существуют только в этой области.

Вам нужно либо запустить все в EXEC, либо ничего из этого. Вы не можете смешивать и сопоставлять. Если вы хотите параметризовать имя таблицы, вам необходимо выполнить весь код в EXEC.

+0

Спасибо, Ричард! –

+0

Итак, если я хочу объявить курсор с именем динамической таблицы без использования EXEC, как я могу это сделать? –

+0

@TamNguyen вы вообще не можете, любой подход в РСУБД будет специфичен для этой СУБД (и я ожидаю, что большинство из них ее не поддержат). – Richard

1

Вы не можете создать динамически определенный курсор в Sybase ASE. Во-первых, причиной отказа вашего примера является то, что курсор объявлен внутри EXEC, который является вложенной областью по сравнению с внешним блоком, и поэтому курсор недоступен вне EXEC. В принципе, вы можете обернуть объявление целиком плюс open-fetch-close в EXEC (лучше всего поместить все это в строковую переменную), но тогда другая проблема будет связана с тем, как можно объявить (не) курсор , который сам по себе не связан с EXEC, но приведет к его отказу в любом случае.

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