Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.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
Oracle执行立即选择错误_Oracle_Plsql_Procedure - Fatal编程技术网

Oracle执行立即选择错误

Oracle执行立即选择错误,oracle,plsql,procedure,Oracle,Plsql,Procedure,我有上面的程序。我有一个表,其中包含数据库中所有模式的所有表。在这个过程中,我尝试将每个表行都插入到表中。问题是我得到了这个错误:00933。00000-“SQL命令未正确结束”。奇怪的是,DBMS输出为每个表输出完美的数据。如果我做了一个例外,并试图执行立即只为用户我没有登录它的工作 为什么需要对SELECT语句使用EXECUTE IMMEDIATE?@user75ponic-因为它们希望将表所有者和表名作为变量传递。如果将dbms\u输出移动到EXECUTE IMMEDIATE之前,您将看到

我有上面的程序。我有一个表,其中包含数据库中所有模式的所有表。在这个过程中,我尝试将每个表行都插入到表中。问题是我得到了这个错误:00933。00000-“SQL命令未正确结束”。奇怪的是,DBMS输出为每个表输出完美的数据。如果我做了一个例外,并试图执行立即只为用户我没有登录它的工作

为什么需要对
SELECT
语句使用
EXECUTE IMMEDIATE
?@user75ponic-因为它们希望将表所有者和表名作为变量传递。如果将
dbms\u输出
移动到
EXECUTE IMMEDIATE
之前,您将看到它尝试了什么。顺便说一句,a会简化一点。@raulnoob-动态SQL是一个很难处理的问题。您需要更好的异常处理。一个好的开始是在执行动态语句之前显示它。这样,当你的灯笼裤坏了的时候,你就能发现它了。很可能是
tbl\u table\u row\u count
@WilliamRobertson中的数据有问题-一条更新语句而不是三条将进一步简化:)
CREATE OR REPLACE PROCEDURE USP_table_row_count
AS
    v_id  NUMBER :=0;
    v_table_name VARCHAR2(100);
    v_owner VARCHAR2(100);
    v_count NUMBER;
    v_row_count NUMBER;

    CURSOR c_tables IS 
        SELECT fld_id ,fld_owner, fld_table_name,fld_row_count_new FROM tbl_table_row_count;
BEGIN
    OPEN c_tables;
    LOOP
        FETCH c_tables INTO v_id,v_owner, v_table_name, v_row_count;
        EXIT WHEN c_tables%notfound;

        EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM '||v_owner||'.'||v_table_name INTO v_count;
        DBMS_OUTPUT.PUT_LINE(v_owner || ' '|| v_table_name ||' '|| v_count);

        UPDATE TBL_TABLE_ROW_COUNT SET FLD_ROW_COUNT_OLD=V_ROW_COUNT WHERE FLD_id=v_id;
        UPDATE TBL_TABLE_ROW_COUNT SET FLD_ROW_COUNT_NEW=V_COUNT WHERE FLD_id=v_id;
        UPDATE TBL_TABLE_ROW_COUNT SET FLD_row_DIF=V_COUNT-v_ROW_COUNT WHERE FLD_id=v_id;
    END LOOP;

    CLOSE c_tables;
END;
/