Вам не нужно писать хранимую процедуру; Вы просто должны сказать IDS, какой тип NULL. Предполагая, что вы не используете IDS 7.31 (который не поддерживает нотацию приведения), вы можете написать:
SELECT NULL::INTEGER FROM dual;
SELECT CAST(NULL AS INTEGER) FROM dual;
И, если у вас нет таблицы dual
(вероятно, нет), вы можете сделать одну из нескольких вещей:
CREATE SYNONYM dual FOR sysmaster:"informix".sysdual;
Таблица «sysdual» была добавлена относительно недавно (IDS 11.10, IIRC), поэтому, если вы используете более старую версию, ее не будет. Следующее работает с любой версией IDS - это то, что я использую.
-- @(#)$Id: dual.sql,v 2.1 2004/11/01 18:16:32 jleffler Exp $
-- Create table DUAL - structurally equivalent to Oracle's similarly named table.
-- It contains one row of data.
CREATE TABLE dual
(
dummy CHAR(1) DEFAULT 'x' NOT NULL CHECK (dummy = 'x') PRIMARY KEY
) EXTENT SIZE 8 NEXT SIZE 8;
INSERT INTO dual VALUES('x');
REVOKE ALL ON dual FROM PUBLIC;
GRANT SELECT ON dual TO PUBLIC;
Идиоматически, если вы собираетесь ВЫБРАТЬ из Systables, чтобы получить одну строку, вы должны включить 'WHERE tabid = 1
'; это запись для самой Systables, и если она отсутствует, то тот факт, что ваш оператор SELECT действительно возвращает какие-либо данные, является наименьшей из ваших проблем. (Хотя я никогда не видел это как ошибку.)