2011-03-17 25 views
1

我對PL/SQL遊戲相當陌生,我試圖想出一個簡短腳本來創建登錄並授予只讀/讀取 - 撰寫特權(根據需要提供必要的補助金)。但是,我遇到了可變範圍問題。有人可以幫助我可能做錯什麼嗎?ORA-01036:PL/SQL腳本上的非法變量名稱/數字

剪斷如下:

DECLARE CNT INTEGER; 

BEGIN 

    SELECT COUNT(*) 
    INTO CNT 
    FROM dba_users 
    WHERE username = :ParamUserName 

    IF (CNT > 0) THEN 
    IF (INSTR(:ParamSelectedRole, 'WRITE') = 0) THEN 
     REVOKE UNLIMITED TABLESPACE FROM :ParamUserName; 
     REVOKE READ_WRITE FROM :ParamUserName; 

     GRANT READ_ONLY TO :ParamUserName; 
    ELSE 
     GRANT UNLIMITED TABLESPACE TO :ParamUserName; 
    END IF; 
    ELSE 
    CREATE USER :ParamUserName DEFAULT TABLESPACE USERS TEMPORARY TABLESPACE TEMP IDENTIFIED BY ":ParamUserPassword" PROFILE ELEV_USER; 
    ALTER USER :ParamUserName PASSWORD EXPIRE; 

    GRANT :ParamSelectedRole TO :ParamUserName; 
    GRANT CREATE SESSION TO :ParamUserName; 

    IF (INSTR(:ParamSelectedRole, 'WRITE') > 0) THEN 
     GRANT UNLIMITED TABLESPACE TO :ParamUserName; 
    END IF; 
    END IF; 
END; 

使用ODP.NET和使用OracleCommand.Parameters.Add()

+0

發佈'parameters.add'示例 - Oracle BIND變量需要每個實例的BIND變量值。 BIND變量未被命名 - 相同的名稱並不意味着每個實例都使用該值。 – 2011-03-17 02:57:58

回答

2

所有DDL語句參數化他們我正在做的變量賦值(GRANT,REVOKE,創建和更改)需要在一個EXECUTE IMMEDIATE如

EXECUTE IMMEDIATE 'REVOKE UNLIMITED TABLESPACE FROM '||:ParamUserName; 

EXECUTE IMMEDIATE 'ALTER USER '||:ParamUserName||' PASSWORD EXPIRE'; 

其實,我會簡化一下,並把所有的外部變量放在一個地方。

DECLARE 
    V_CNT INTEGER; 
    V_USER VARCHAR2(30); 
    V_ROLE VARCHAR2(30); 
BEGIN 
    -- 
    V_USER := :ParamUserName; 
    V_ROLE := :ParamSelectedRole; 
    V_PWD := :ParamUserPassword; 
    -- 
    SELECT COUNT(*) 
    INTO V_CNT 
    FROM dba_users 
    WHERE username = v_user 

    IF (CNT > 0) THEN 
    IF (INSTR(v_role, 'WRITE') = 0) THEN 
     EXECUTE IMMEDIATE 'REVOKE UNLIMITED TABLESPACE FROM '||v_user; 
     EXECUTE IMMEDIATE 'REVOKE READ_WRITE FROM '||v_user; 
     EXECUTE IMMEDIATE 'GRANT READ_ONLY TO '||v_user; 
    ELSE 
     EXECUTE IMMEDIATE 'GRANT UNLIMITED TABLESPACE TO '||v_user; 
    END IF; 
    ELSE 
    EXECUTE IMMEDIATE 'CREATE USER '||v_user|| 
         'DEFAULT TABLESPACE USERS TEMPORARY TABLESPACE TEMP '|| 
         'IDENTIFIED BY '||v_pwd||' PROFILE ELEV_USER'; 
    EXECUTE IMMEDIATE 'ALTER USER '||v_user||' PASSWORD EXPIRE; 

    EXECUTE IMMEDIATE 'GRANT '||v_role||' TO '||v_user; 
    EXECUTE IMMEDIATE 'GRANT CREATE SESSION TO '||v_user; 

    IF (INSTR(v_role, 'WRITE') > 0) THEN 
     EXECUTE IMMEDIATE 'GRANT UNLIMITED TABLESPACE TO '||v_user; 
    END IF; 
    END IF; 
END; 
+0

哇。謝謝。從未聽說過直到今天執行。這真的有幫助! – yungun 2011-03-17 13:48:25

相關問題