2016-08-09 82 views
0

Ich versuche, die folgende ProzedurPL SQL, Fehler (32,43): PLS-00201: Bezeichner 'HR' müssen deklariert werden

EXECUTE StudentNames(12345, true)  

Ich erhalte die folgenden Fehler auszuführen;

Fehler (32,43): PLS-00201: Bezeichner 'HR' muss

deklariert werden es in diesem Teil des Codes verknüpft ist:

IF p_bool AND v_studid = 12345 THEN 
    EXECUTE IMMEDIATE 'grant select on '||HR||'.'||STUDNAME_12345||' to student_12345'; 
    END IF; 

ich auf der Suche bin um die Kursteilnehmernummer und einen booleschen Wert an die Prozedur zu übergeben. Wenn PASS -> der Code gewährt wählen Sie Privilegien für Student_12345 auf Tabelle hr.studenname_12345.

Ich kann sehen, das Problem mit HR verbunden ist, nur fragen, wie es zu lösen?

Vielen Dank im Voraus.

CREATE OR REPLACE PROCEDURE StudentNames 
    (p_studnumber IN students.student_id%TYPE, 
    p_bool IN BOOLEAN) 
IS 
    v_stud   students.student_id%TYPE := p_studnumber; 
    v_studid  students.student_id%TYPE; 
    v_firstname  students.firstname%TYPE; 
    v_lastname  students.lastname%TYPE; 

    e_no_test_returned EXCEPTION; 
    e_no_table   EXCEPTION; 
    PRAGMA EXCEPTION_INIT (e_no_table, -942); 


    CURSOR c_stud_cursor (p_studno NUMBER)IS 
    SELECT firstname, lastname 
    FROM students 
    WHERE student_id = p_studno; 

BEGIN 

    EXECUTE IMMEDIATE 
    'SELECT student_id 
    FROM students 
    WHERE student_id = :v_stud' 
    INTO v_studid 
    USING v_stud; 
    DBMS_OUTPUT.PUT_LINE(v_studid); 
    DBMS_OUTPUT.PUT_LINE(' '); 

    IF p_bool AND v_studid = 12345 THEN 
    EXECUTE IMMEDIATE 'grant select on '||HR||'.'||STUDNAME_12345||' to student_12345'; 
    END IF; 

    OPEN c_stud_cursor(v_studid); 
    LOOP 
    FETCH c_stud_cursor INTO v_firstname, v_lastname; 
    EXIT WHEN c_stud_cursor%NOTFOUND; 

------NAMES-------------------- 
     IF v_studid = 12345 THEN   
      INSERT INTO studname_12345(first_name, last_name) 
      VALUES (v_firstname, v_lastname); 
      COMMIT; 


     ELSIF v_studid = 12346 THEN   
      INSERT INTO studname_12346(first_name, last_name) 
      VALUES (v_firstname, v_lastname); 
      COMMIT; 

     ELSIF v_studid IS NULL THEN 
     RAISE e_no_test_returned; 

    END IF; 

    END LOOP; 


    CLOSE c_stud_cursor; 



EXCEPTION 
--The value passed to the student_id parameter is not an integer. 
    WHEN INVALID_NUMBER THEN 
    DBMS_OUTPUT.PUT_LINE('The value passed to the student_id parameter is not an integer'); 

    WHEN TOO_MANY_ROWS THEN 
    DBMS_OUTPUT.PUT_LINE('More than one student with same id'); 

--The value passed to the student_id parameter does not exist in the student tables. 
--The value passed to the student_id parameter is null. 
    WHEN NO_DATA_FOUND THEN 
    DBMS_OUTPUT.PUT_LINE('Student ID does not exist in the student table'); 

--There are no test results for the Student. 
    WHEN e_no_test_returned THEN 
    DBMS_OUTPUT.PUT_LINE('There are no results for Student - '||v_stud); 

    WHEN OTHERS THEN 
    DBMS_OUTPUT.PUT_LINE('Some other error occurred.'); 


END StudentNames; 
/

CREATE STUDENT/ROLLE/ADD KONTO ROLLE

CREATE USER student_12345 
IDENTIFIED BY pw1234; 

--Create a Student Role 12345 
CREATE ROLE student1; 

--Adding the account to the student role 
GRANT student1 
TO student_12345; 


--Allow accounts access the database 
GRANT create session 
TO student_12345; 

CREATE TABLE

CREATE TABLE studname_12345 
    (first_name VARCHAR2(30), 
    last_name VARCHAR2(30) 
    ); 

Antwort

2

Sie keine Variable HR im Code genannt haben - das ist, was Oracle beklagt.

Was Sie wahrscheinlich statt dessen wollen:

EXECUTE IMMEDIATE 'grant select on '||HR||'.'||STUDNAME_12345||' to student_12345'; 

ist dies:

EXECUTE IMMEDIATE 'grant select on HR.STUDNAME_12345 to student_12345'; 
+0

Danke Frank - jetzt läuft. – saggart

+0

@saggart Gern geschehen. Wenn das Problem dadurch behoben wurde, markieren Sie bitte meine Antwort als akzeptiert (indem Sie auf das Häkchen daneben klicken). –