对于PL/SQL中的循环和列
我是PL/SQL方面的新手。我对这种语言中的循环有问题。我想做这样的循环:对于PL/SQL中的循环和列,sql,database,oracle,plsql,Sql,Database,Oracle,Plsql,我是PL/SQL方面的新手。我对这种语言中的循环有问题。我想做这样的循环: FOR nr IN 1..102 LOOP DBMS_OUTPUT.PUT_LINE(nr); IF rec.column_||nr IS NULL THEN DBMS_OUTPUT.PUT_LINE('test'); END IF; END LOOP; 我已经创建了一个游标。正如您所看到的,我想检查从列1到列102的所有列的名称。不幸的是| |操作员不适合这种情况。 你知道我的问题的解决
FOR nr IN 1..102
LOOP
DBMS_OUTPUT.PUT_LINE(nr);
IF rec.column_||nr IS NULL
THEN
DBMS_OUTPUT.PUT_LINE('test');
END IF;
END LOOP;
我已经创建了一个游标。正如您所看到的,我想检查从列1到列102的所有列的名称。不幸的是| |操作员不适合这种情况。
你知道我的问题的解决办法吗?你可以用它来解决。使用语句以PL/SQL形式执行字符串参数,您可以按照问题中的意图使用| |
进行补充
例如:
BEGIN
FOR nr IN 1..102
LOOP
DBMS_OUTPUT.PUT_LINE(nr);
EXECUTE IMMEDIATE
'BEGIN ' ||
'IF rec.column.' || nr ||' is null THEN ' ||
'DBMS_OUTPUT.PUT_LINE(''test''); ' ||
'END IF; ' ||
'END; ';
END LOOP;
END;
或者您也可以将rec.column.| | nr | | |为空
分配给变量,并使PUT_行
位于执行立即
部分之外:
更新:似乎无法绑定布尔
变量,因此我修改了示例以使用数字
更新2:有可能提高效率,尽管在这种情况下可能不合适。对动态SQL使用常量VARCHAR
,并使用绑定变量传入nr
。如果在大循环中,这甚至比使用本机SQL更有效。我不认为'rec.column.:arg为null
将作为'rec.column.1为null执行
DECLARE
isnull NUMBER;
BEGIN
FOR nr IN 1..102
LOOP
DBMS_OUTPUT.PUT_LINE(nr);
EXECUTE IMMEDIATE
'BEGIN ' ||
'IF rec.column.' || nr ||' IS NULL THEN ' ||
':x:=1; ' ||
'ELSE ' ||
':x:=0; ' ||
'END IF; ' ||
'END; '
USING OUT isnull;
IF isnull = 1 THEN
DBMS_OUTPUT.PUT_LINE('test');
END IF;
END LOOP;
END;
更新3:
鉴于:
- 无法访问动态SQL语句中的
rec
,因为它未定义(超出范围)
- 似乎不可能将非sql类型作为参数传递给动态语句(记录、游标)
一种可能的解决方法是将一些id列(SQL类型)绑定到动态语句,并使用select
子句来确定当前列是否为空:
DECLARE
isnull NUMBER;
rec_id NUMBER; -- Identifier of the fetched record
BEGIN
rec_id := rec.id;
FOR nr IN 1..102
LOOP
DBMS_OUTPUT.PUT_LINE(nr);
EXECUTE IMMEDIATE
'SELECT 1 FROM my_table WHERE id = :idarg ' ||
' AND column_' || nr || ' IS NULL'
INTO isnull USING rec_id;
IF isnull = 1 THEN
DBMS_OUTPUT.PUT_LINE('test');
END IF;
END LOOP;
END;
你能给我举个例子吗?不幸的是布尔不是sql类型,我因此得到了一个错误。是的,你是对的,正如解释的那样。我只是在测试时发现了这一点。我已经更新了这个示例,改为使用数字
。我现在有另一个问题,也许你也可以帮我解决。当我尝试用上面的代码运行我的过程时。我得到这个错误:PLS-00201:必须声明标识符'rec.column_1'。“立即执行…”行出现此问题。发生此错误的原因是rec
未定义且超出了动态SQL中的范围。据我所知,它没有简单的解决方法,也许您应该将某种标识符(带有SQL类型)绑定到动态SQL并使用select
子句。查看更新的答案,并让我知道这是否适合您。