Sql 使用过程输出副本 我正在学习中,目前正在做一些练习。

Sql 使用过程输出副本 我正在学习中,目前正在做一些练习。,sql,plsql,output,procedure,Sql,Plsql,Output,Procedure,我试图制作一个程序来显示一行中有多少份副本 CREATE OR REPLACE PROCEDURE anzahl1( tabelle VARCHAR2, reihe VARCHAR2, wieviel OUT NUMBER )AS test VARCHAR2(4000); BEGIN EXECUTE IMMEDIATE 'SELECT reihe, (COUNT(*)-1) AS Anzahl INTO

我试图制作一个程序来显示一行中有多少份副本

CREATE OR REPLACE PROCEDURE anzahl1(
    tabelle VARCHAR2,
    reihe VARCHAR2,
    wieviel OUT NUMBER
    )AS
    test VARCHAR2(4000);
BEGIN

    EXECUTE IMMEDIATE 'SELECT
        reihe,
        (COUNT(*)-1) AS Anzahl
    INTO     
        wieviel
    FROM 
        tabelle
    GROUP BY 
        reihe
    HAVING COUNT(*) > 1' using out wieviel;
    DBMS_OUTPUT.PUT_LINE(wieviel);

END;
/
我尝试了很多东西,但都没用

即使是我以前学校的老师给我的结果也不起作用:

CREATE OR REPLACE PROCEDURE check_doppelte_Werte_p ( 
   p_tabellenname   IN     USER_TAB_COLUMNS.TABLE_NAME%TYPE, 
   p_spaltenname    IN     USER_TAB_COLUMNS.COLUMN_NAME%TYPE, 
   p_ergebnis       BOOLEAN 
) OUT     
IS 
   v_dummy           NUMBER := 1; 
   v_sql_anweisung   varchar2 (4000); 
BEGIN 
   v_sql_anweisung := 
         'SELECT   MAX(COUNT (' 
      || p_spaltenname 
      || ')) ' 
      || '  FROM   ' 
      || p_tabellenname 
      || '  GROUP BY ' 
      || p_spaltenname; 

   DBMS_OUTPUT.PUT_LINE (v_sql_anweisung); 

   EXECUTE IMMEDIATE v_sql_anweisung INTO   v_dummy; 

   IF v_dummy > 1 THEN  
     DBMS_OUTPUT.PUT_LINE(   'Die Tabelle ' 
                          || 'hat mindestens  ' 
                          || TO_CHAR (V_DUMMY) 
                          || ' doppelte Werte in der Spalte ' 
                          || p_spaltenname); 
     p_ergebnis := TRUE; 
  ELSE  
     p_ergebnis := FALSE; 
  END IF; 
EXCEPTION 
   -- Keine Werte gefunden, da  
   WHEN NO_DATA_FOUND 
   THEN 
      p_ergebnis := FALSE; 
 DBMS_OUTPUT.PUT_LINE ('Tabellenname oder Spaltenname sind nicht vorhan-
den!!!'); 
END;

您将如何做/更改?

您的代码不会替换动态sql中的变量。查询字符串将附加输入变量

请尝试下面的代码

 CREATE OR REPLACE PROCEDURE anzahl1(
tabelle VARCHAR2,
reihe VARCHAR2,
wieviel OUT NUMBER
)AS
test VARCHAR2(4000);
lv_query VARCHAR2(4000);

BEGIN

lv_query := 'SELECT (COUNT(*)-1) cnt FROM '||tabelle ||' GROUP BY '||reihe||' HAVING COUNT(*) > 1';

EXECUTE IMMEDIATE lv_query into wieviel;

DBMS_OUTPUT.PUT_LINE(wieviel);

EXCEPTION 
     WHEN OTHERS THEN 
       DBMS_OUTPUT.PUT_LINE('ERROR '||SQLCODE||' '||SUBSTR(SQLERRM,1,200));

    END;
/
我创建表并填充记录,如下所示

   CREATE TABLE EMP(ID NUMBER(10),NAME VARCHAR2(40));

    INSERT INTO EMP VALUES (1, 'TEST');
    INSERT INTO EMP VALUES (1, 'TEST');
    INSERT INTO EMP VALUES (2, 'TEST2');
现在我调用存储过程来测试ID列的EMP表

declare 
lv_cnt number(10);
begin
anzahl1('EMP','ID',lv_cnt);
dbms_output.put_line(lv_cnt);

end;
这将输出为

1

您的代码不会替换动态sql中的变量。查询字符串将附加输入变量

请尝试下面的代码

 CREATE OR REPLACE PROCEDURE anzahl1(
tabelle VARCHAR2,
reihe VARCHAR2,
wieviel OUT NUMBER
)AS
test VARCHAR2(4000);
lv_query VARCHAR2(4000);

BEGIN

lv_query := 'SELECT (COUNT(*)-1) cnt FROM '||tabelle ||' GROUP BY '||reihe||' HAVING COUNT(*) > 1';

EXECUTE IMMEDIATE lv_query into wieviel;

DBMS_OUTPUT.PUT_LINE(wieviel);

EXCEPTION 
     WHEN OTHERS THEN 
       DBMS_OUTPUT.PUT_LINE('ERROR '||SQLCODE||' '||SUBSTR(SQLERRM,1,200));

    END;
/
我创建表并填充记录,如下所示

   CREATE TABLE EMP(ID NUMBER(10),NAME VARCHAR2(40));

    INSERT INTO EMP VALUES (1, 'TEST');
    INSERT INTO EMP VALUES (1, 'TEST');
    INSERT INTO EMP VALUES (2, 'TEST2');
现在我调用存储过程来测试ID列的EMP表

declare 
lv_cnt number(10);
begin
anzahl1('EMP','ID',lv_cnt);
dbms_output.put_line(lv_cnt);

end;
这将输出为

1

不工作是不够具体的。请详细说明您在这两个代码块中遇到的问题:您是否遇到错误?错误的结果?哦,对不起。1.代码我收到错误PLS-00306 2。代码PLS-00201,好像我没有声明程序。不工作是不够具体的。请详细说明您在这两个代码块中遇到的问题:您是否遇到错误?错误的结果?哦,对不起。1.代码我收到错误PLS-00306 2。代码PLS-00201,就好像我没有声明程序一样。非常感谢,我尝试了类似的方法bevor,但我不知道您何时使用“立即执行”,我必须使用“使用”部分。我仍然得到错误,anzahl1(程序名称)即使我删除了具有相同名称的过程并再次启动该文件,也未声明。如果您试图从相同架构访问该过程,它应该可以工作,否则您需要。为该过程创建同义词,并为尝试从中执行该过程的用户授予执行权限。你能分享完整的错误信息吗?Zeile 1:ORA-06550:Zeile 1,Spalte 7:PLS-00201:ID'ANZAHL'muss deklariert werden ORA-06550:Zeile 1,Spalte 7:PL/SQL:Statement ignoredI已经更新了代码并测试了相同的代码。它工作得很好。您遇到的错误是因为您尝试运行该过程的用户对该过程没有执行权限。请使用更新的代码,因为我做了一些小的更改。非常感谢,我尝试了类似的方法bevor,但我不知道您何时使用“立即执行”,我必须使用“使用”部分。我仍然收到错误anzahl1(过程名称)即使我删除了具有相同名称的过程并再次启动该文件,也未声明。如果您试图从相同架构访问该过程,它应该可以工作,否则您需要。为该过程创建同义词,并为尝试从中执行该过程的用户授予执行权限。你能分享完整的错误信息吗?Zeile 1:ORA-06550:Zeile 1,Spalte 7:PLS-00201:ID'ANZAHL'muss deklariert werden ORA-06550:Zeile 1,Spalte 7:PL/SQL:Statement ignoredI已经更新了代码并测试了相同的代码。它工作得很好。您遇到的错误是因为您尝试运行该过程的用户对该过程没有执行权限。请使用更新后的代码,因为我做了一些小改动。