首页 > 解决方案 > 为什么这个 PL/SQL 找不到表?

问题描述

我有 2 个表 DOQUANGDUC1 和 DOQUANGDUC,在数据库中的表 DOQUANGDUC 列表中我需要检查:

宣布

BEGIN 

    FOR x IN (select table_name,column_name  from DOQUANGDUC) LOOP
         INSERT INTO DOQUANGDUC1 (table_name,column_name)
         SELECT count(x.column_name),column_name FROM x.table_name GROUP BY column_name having count(x.column_name) >2;

    END LOOP;
END;

我运行sql错误

Error at line 1
ORA-06550: line 9, column 57:
PL/SQL: ORA-00942: table or view does not exist
ORA-06550: line 8, column 10:
PL/SQL: SQL Statement ignored

我确信已经有两张桌子在使用。

标签: oracle

解决方案


通过隐式游标或选择语句插入表的方法

我们的要求:

我们正在检查中的记录doquangduc并查找 column_name 出现两次以上的实例。

接下来,我们将这些记录放在另一个表中doquangduc1,同时保留计数(将它们放在 中doquangduc1)。

最终,需要这些记录以便可以查看它们。


关于此要求的评论:

目前还不清楚我们是否真的需要对表进行转换,doquangduc然后插入另一个表以查看结果记录。这个答案假设这是必要的。

我们首先为需要的表创建并执行 DDL。

CREATE TABLE doquangduc
    AS
        SELECT
            table_name,
            column_name
        FROM
            user_tab_columns;

我们创建表 ,doquangduc1并确保有一个名为 col_count 的列:

CREATE TABLE doquangduc1
    AS
        SELECT
            table_name,
            column_name,
            1 col_count
        FROM
            user_tab_columns
        WHERE
            table_name IS NULL;

我们对表格进行排序doquangduc以确定您已确定的方案。

   BEGIN
    FOR x IN (
        WITH qry AS (
            SELECT
                table_name,
                column_name,
                COUNT(1)
                OVER(PARTITION BY column_name) AS col_count
            FROM
                user_tab_columns
        )
        SELECT
            table_name,
            column_name,
            col_count
        FROM
            qry
        WHERE
            col_count > 2
    ) LOOP
        INSERT INTO doquangduc1 (
            table_name,
            column_name,
            col_count
        ) VALUES (
            x.table_name,
            x.column_name,
            x.col_count
        );

    END LOOP;
END;

正如许多人所评论的那样,我们真的需要一个隐式游标来执行这个插入到表中doquangduc1,以便我们可以查看结果吗?

我们可以使用 SELECT 语句执行 INSERT INTO 以更有效地将这些记录插入doquangduc1

INSERT INTO doquangduc1
    WITH qry AS (
        SELECT
            table_name,
            column_name,
            COUNT(1)
            OVER(PARTITION BY column_name) AS col_count
        FROM
            user_tab_columns
    )
    SELECT
        table_name,
        column_name,
        col_count
    FROM
        qry
    WHERE
        col_count > 2;

推荐阅读