Как проверить запрос без выполнения в PowerBuilder - PullRequest
0 голосов
/ 04 мая 2018

интересно, есть ли способ проверить запрос перед выполнением

Есть ли способ проверить / проверить запрос, не выполняя его?

Ответы [ 3 ]

0 голосов
/ 05 мая 2018

Одним из способов проверки SQL является добавление к SQL условия, которое никогда не может быть истинным.

Пример:

long ll_rc
long ll_result
string ls_sql, ls_test
string ls_message

//Arbitrary SQL
ls_sql = "SELECT * FROM DUAL"

//This SQL when executed will always return 0 if successful.
ls_test = "select count(*) from ( " + ls_sql + " WHERE 1 = 2 )" 

DECLARE l_cursor DYNAMIC CURSOR FOR SQLSA ;
PREPARE SQLSA FROM :ls_test;
OPEN DYNAMIC l_cursor;

ll_rc = SQLCA.SQLCODE
choose case ll_rc
    case 0
        //Success
        ls_message = "SQL is properly formed"
    case 100
        //Fetched row not found. This should not be the case since we only opened the cursor
        ls_message = SQLCA.SQLERRTEXT
    case -1
        //Error; the statement failed. Use SQLErrText or SQLDBCode to obtain the detail.
        ls_message = SQLCA.SQLERRTEXT
end choose

CLOSE l_cursor ; //This will fail if open cursor failed. 

messagebox( "Result", ls_message )

Примечание. Если ваш SQL-код ОЧЕНЬ сложен, а я подозреваю, что это не так, оптимизатору базы данных может потребоваться несколько секунд для подготовки SQL-кода. Это будет значительно меньше времени, чем если бы вы запустили весь запрос.

0 голосов
/ 07 мая 2018

Поместите оператор выбора в любой скрипт и скомпилируйте его. Частью работы будет проверка синтаксиса SQL в базе данных, к которой вы подключены. Осторожно: вам нужна хотя бы одна связанная переменная в списке столбцов вашего оператора SQL. Это не относится к другим операторам DML.

Пример: в моем случае:

select noms into :ls_ttt  from contacts;

приводит к сообщению Unknown columns 'noms' in 'field list'.

Тем не менее,

select nom into :ls_ttt  from contacts;

не показывает ошибок.

Надеюсь, это поможет.

0 голосов
/ 04 мая 2018

Поскольку база данных является окончательным арбитром для того, что является «действительным» (имена таблиц и столбцов и т. Д.), Общий ответ - нет. Теперь вы можете создать класс в PB, который проверяет синтаксис операторов, имена объектов и т. Д., Поэтому вам не нужно прикасаться к БД, но он устареет, как только в БД будут внесены какие-либо изменения.

...