Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/91.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对于PL/SQL中的循环和列_Sql_Database_Oracle_Plsql - Fatal编程技术网

对于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的所有列的名称。不幸的是| |操作员不适合这种情况。 你知道我的问题的解决

我是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的所有列的名称。不幸的是| |操作员不适合这种情况。 你知道我的问题的解决办法吗?

你可以用它来解决。使用语句以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
子句。查看更新的答案,并让我知道这是否适合您。