2017-01-20 30 views
-1

別のテーブルからテーブルにレコードを挿入しますparamとProjectアクセスを "Y"のようなハードコード値として使用し、プロジェクトテーブルからすべての値を返します。私はSQLに新しいです。 誰かがプロジェクトIDまたはプロジェクトテーブル Project_access_idは、プロジェクト名は、プロジェクトのプロジェクト名でなければなりません すべての行にYとしてシーケンス Project_accessによって生成されるように私は、プロジェクトへのアクセス User_ID-で手順に渡すパラメータを持つ別のテーブルから、私は別のテーブルにレコードを挿入したい

は手順 Project_object_idのPARAMする必要があります助けることができます。

+1

サンプルデータと欲望の結果は、あなたがしたいことを明確にします。あなたの質問には、あなたが提供するデータモデルで特定されていない "userName"、 "param"、 "hard code value"のようなものも含まれています。 –

+0

私はプロジェクトレコードからproject_accessテーブルにレコードを挿入したい – user1213199

+0

User_ID-はプロジェクトIDまたはプロジェクトテーブルとしてProject_object_idのparamでなければなりませんProject_access_idはシーケンスによってProject_accessがすべての行でYとして生成されますプロジェクト名はprojecのプロジェクト名でなければなりません – user1213199

答えて

1

あなたは、次のようなものが必要な場合があります。手順で

insert into tableTarget(column1, column2, column3) 
select column1, column2, 'hardcoded value' 
from tableSource 

を:

create or replace procedure yourProc(x in number) as 
begin 
    insert into tableTarget(column1, column2, column3) 
    select column1, column2, x 
    from tableSource; 
end; 
+0

ありがとう。それをストアドプロシージャで取得する方法。そして、ハードコードされた値がパラメータのように来る場合はどうすれば – user1213199

+0

それは全く同じことです。以下の作成またはPROCEDURE populateResource (VARCHAR2にユーザー名) を交換するように、私は同じことをしようとした – Aleksej

+0

を表示だけで編集したPROJECT_ACCESS (USER_ID、PROJECT_OBJECT_ID、PROJECT_ACCESS.PROJECT_ACCESS_ID、PROJECT_ACCESS.PROJECT_ACCESS、PROJECT_ACCESS.PROJECT_NAME) に挿入 をBEGIN ISユーザ名、PROJECT.PROJECT_ID、PROJECT_ACCESS_SEQ.NEXTVAL、 'Y'、PROJECTを選択します。PROJECT_NAME PROJECTから COMMIT; END;しかし、それは は、PROJECT_ACCESS (USER_ID、PROJECT_OBJECT_ID、PROJECT_ACCESS.PROJECT_ACCESS_ID、PROJECT_ACCESS.PROJECT_ACCESS、PROJECT_ACCESS.PROJECT_NAME)に 選択名を挿入 をBEGIN IS – user1213199

0
CREATE OR REPLACE PROCEDURE grantUserProjectAccess(
    in_user_id   IN PROJECT_ACCESS.USER_ID%TYPE, 
    in_project_object_id IN PROJECT_ACCESS.PROJECT_OBJECT_ID%TYPE, 
    out_error   OUT VARCHAR2 
) 
AS 
    v_project_name PROJECT_ACCESS.PROJECT_NAME%TYPE; 
BEGIN 
    SELECT project_name 
    INTO v_project_name 
    FROM project 
    WHERE project_object_id = in_project_object_id; 

    INSERT INTO project_access (
    user_id, 
    project_object_id, 
    project_access_id, 
    project_access, 
    project_name 
) VALUES (
    in_user_id, 
    in_project_object_id, 
    PROJECT_ACCESS_SEQ.NEXTVAL, 
    'Y', 
    v_project_name 
); 

    out_error := NULL; 
EXCEPTION 
    WHEN NO_DATA_FOUND THEN 
    out_error := 'Project Not Found'; 
    WHEN DUP_VAL_ON_INDEX THEN 
    out_error := 'Duplicate Entry'; 
END; 
/

(注:あなたは非常に良い理由がない限り、内部手続きをコミット呼び出さないでください - プロシージャを呼び出す最も外側のブロックのデータをコミットする - プロシージャの呼び出しをネストすることができます。必要に応じて、シーケンス全体にROLLBACKを発行します手続きの実施。部分的なロールバックのみを行う場合は、SAVEPOINTを使用することを検討してください。

関連する問題