2017-05-30 163 views
0

我在下面的存儲過程編寫PL/SQL更新命令不更新

CREATE OR REPLACE PROCEDURE EmployeeProcedure 
(id IN NUMBER, name IN VARCHAR, salary IN NUMBER, 
stmt IN VARCHAR 
) AS 

BEGIN 
IF stmt='INSERT' then 
    INSERT INTO Employee(employee_id,name,salary) VALUES(id, name, salary); 
END IF; 

IF stmt='UPDATE' then 
    update employee set name=name, salary=salary 
     where employee_id=id; 
END IF; 

IF stmt='DELETE' then 
    Delete from employee where employee_id=id; 
END IF; 

END EmployeeProcedure; 

這是可在僱員表

EMPLOYEE_ID NAME SALARY TITLE 
2 Ranjan 40000 Manager 
3 Stella 5000 President 
4 Fred 500 Janitor 
10 Ranjan 3000 - 
1 John 64876 - 

當我執行該存儲的數據在數據庫中的記錄程序使用以下statment

begin 
EmployeeProcedure(10,'John',78987,'UPDATE'); 
end; 

我正在處理的語句。但員工ID = 10的記錄沒有更新。任何幫助將不勝感激!

+0

只是可以肯定:你在某個時刻犯下你的交易是正確的? –

+0

你正在使用哪個數據庫? –

回答

0

不要使用相同的名稱,只要你想更新

這不是什麼都不做現場使用的變量:

SET name = name, salary = salary 

設置你的變量,如:

str_name, int_salary 

然後你將有

SET name = str_name, salary = int_salary 
0

在調用您的過程或程序本身時,我看不到提交。

如果您的執行從您聲明的匿名塊運行,請務必在事後提交。

另外,作爲胡安·卡洛斯·Oropeza說,具有相同名稱的列中的參數,已被證明是一種不好的做法,追加字母「P」來區分列名的參數,如:

CREATE OR REPLACE PROCEDURE EmployeeProcedure 
(p_id IN NUMBER, p_name IN VARCHAR, p_salary IN NUMBER, 
p_stmt IN VARCHAR 
) AS 

BEGIN 
IF p_stmt='INSERT' then 
    INSERT INTO Employee(employee_id,name,salary) VALUES(p_id, p_name, p_salary); 
END IF; 

IF p_stmt='UPDATE' then 
    update employee set name=p_name, salary=p_salary 
     where employee_id=p_id; 
END IF; 

IF p_stmt='DELETE' then 
    Delete from employee where employee_id=p_id; 
END IF; 

END EmployeeProcedure; 
+0

謝謝賈爾,它現在正在工作..你能否也請幫我一個更多的條件IF p_stmt ='選擇',然後選擇*從員工;萬一;我試過這個代碼,但它不工作.. –

+0

不客氣,我在另一個答案,在同一主題中發佈了你的新問題的答案,因爲我的答覆使用了比評論中允許的更多的字符。 –

0

很高興我幫了忙。

關於在你的過程中使用'select'語句,我認爲你將不得不稍微改變一下實現一個返回值,因爲在PL/SQL塊中使用select語句是不可能的,除非你在明確的/隱含的遊標中使用它。

我想象這樣的事情可以做:

create or replace PROCEDURE EmployeeProcedure(
    p_id IN NUMBER, 
    p_name IN VARCHAR, 
    p_salary IN NUMBER, 
    p_stmt IN VARCHAR, 
    p_CURSOR in out SYS_REFCURSOR 
) AS 
BEGIN 
    IF p_stmt='INSERT' then 
     INSERT INTO Employee(employee_id,name,salary) VALUES(p_id, p_name, p_salary); 
    END IF; 

    IF p_stmt='UPDATE' then 
     update employee set name=p_name, salary=p_salary 
      where employee_id=p_id; 
    END IF; 

    IF p_stmt='DELETE' then 
     Delete from employee where employee_id=p_id; 
    END IF; 

    IF p_stmt='SELECT' then 
     /*open the explicit cursor*/ 
     open p_cursor for 
      select * 
      from employee 
      where employee_id = p_id; 
    END IF; 

END EmployeeProcedure; 

,然後你將要讀光標這樣:

declare 
    cur  SYS_REFCURSOR; 
    data_row employee%rowtype; 
begin 
    EmployeeProcedure(1,null,null,'SELECT', cur);--opens cursor 
    loop 
     fetch cur into data_row; --reads one row 
     exit when cur%notfound; --exits when you reach the end of rows 

     --at this point you can access every row in your table. 
     dbms_output.put_line(data_row.employee_id); 
    end loop; 
    close cur; --always remember close every cursor you open to keep your DBA happy. 
end; 
+0

你能幫我一下聚合函數嗎?以及如何在p_stmt = Insert/update/delete時運行查詢? –

+0

嗨@ranjanjaiswal對不起,但我不知道我明白你想要現在實現什麼。您是否想通過傳遞p_stmt ='insert/update/delete'來允許在一個調用中執行多個操作? –

+0

hi @ jair離開它,我明白了..謝謝你的幫助! –