Blog pribadi untuk curhat, share tentang script, software, kuliah, project IT dan seputar IT.

Stored Procedure to Insert or Update Header and Details Table in MySQL

Tidak ada komentar

If you need to handle multiple detail records for a single header record in your stored procedure, you can modify the procedure to accept a JSON array of detail records. This way, you can pass multiple details in a single call to the stored procedure.


### Updated Stored Procedure


Here’s how you can create a stored procedure that accepts multiple detail records in JSON format:


#### Table Structure Example

Assuming the same table structure as before:


```sql

CREATE TABLE header_table (

    id INT AUTO_INCREMENT PRIMARY KEY,

    header_info VARCHAR(255),

    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP

);


CREATE TABLE detail_table (

    id INT AUTO_INCREMENT PRIMARY KEY,

    header_id INT,

    detail_info VARCHAR(255),

    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,

    FOREIGN KEY (header_id) REFERENCES header_table(id)

);


```


#### Stored Procedure


Here’s the updated stored procedure:



```sql

DELIMITER //


CREATE PROCEDURE SaveOrUpdateHeaderDetail(

    IN p_header_id INT,

    IN p_header_info VARCHAR(255),

    IN p_details JSON

)


BEGIN

    DECLARE v_header_exists INT;


    -- Check if the header exists

    SELECT COUNT(*) INTO v_header_exists

    FROM header_table

    WHERE id = p_header_id;


    -- If header exists, update it

    IF v_header_exists > 0 THEN

        UPDATE header_table

        SET header_info = p_header_info,

            created_at = NOW()

        WHERE id = p_header_id;


    -- If header does not exist, insert a new header

    ELSE

        INSERT INTO header_table (header_info)

        VALUES (p_header_info);


        -- Get the last inserted header ID

        SET p_header_id = LAST_INSERT_ID();

    END IF;




    -- Clear existing details for the header

    DELETE FROM detail_table WHERE header_id = p_header_id;


    -- Insert new details from JSON

    INSERT INTO detail_table (header_id, detail_info)

    SELECT p_header_id, detail_info

    FROM JSON_TABLE(p_details, '$[*]' COLUMNS (detail_info VARCHAR(255) PATH '$')) AS jt;


END //


DELIMITER ;


```




### Explanation


1. **Parameters**:

   - `p_header_id`: The ID of the header to update or `NULL` for a new header.

   - `p_header_info`: The information for the header.

   - `p_details`: A JSON array containing detail records.


2. **Check for Header Existence**: The procedure checks if the header exists.


3. **Update or Insert Header**: If the header exists, it updates the header information; if not, it inserts a new header and retrieves the new `header_id`.


4. **Clear Existing Details**: Before inserting new details, it deletes any existing details associated with the `header_id`. This ensures that you only keep the latest details.


5. **Insert New Details**: It uses `JSON_TABLE` to extract detail information from the JSON array and insert it into the `detail_table`.




### Usage

You can call this stored procedure like this:


```sql


CALL SaveOrUpdateHeaderDetail(

    NULL, 

    'New Header Info', 

    '["Detail 1", "Detail 2", "Detail 3"]'

);


```


Or to update an existing header with new details:




```sql


CALL SaveOrUpdateHeaderDetail(

    1, 

    'Updated Header Info', 

    '["Updated Detail 1", "Updated Detail 2", "Updated Detail 3"]'

);


```


### Note

- Ensure that your MySQL version supports JSON functions (MySQL 5.7 and later).

- Adjust the data types and lengths according to your actual table definitions.

- If you want to keep existing details and just add new ones, you can modify the logic accordingly.

______________________________________________________________________





To create a stored procedure in MySQL that can save or update data in both a header table and a detail table, we first need to define the structure of the tables. Below is an example of how to create the tables, the stored procedure, and how to call it from PHP using PDO.


### Step 1: Create the Tables


```sql

CREATE TABLE header (

    id INT AUTO_INCREMENT PRIMARY KEY,

    header_info VARCHAR(255),

    header_info2 VARCHAR(255),

    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,

    created_by VARCHAR(255),

    modified_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

    modified_by VARCHAR(255)

);


CREATE TABLE detail (

    id INT AUTO_INCREMENT PRIMARY KEY,

    header_id INT,

    detail_info VARCHAR(255),

    detail_info2 VARCHAR(255),

    detail_info3 VARCHAR(255),

    detail_info4 VARCHAR(255),

    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,

    modified_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

    FOREIGN KEY (header_id) REFERENCES header(id) ON DELETE CASCADE

);

```


### Step 2: Create the Stored Procedure


```sql

DELIMITER //


CREATE PROCEDURE SaveOrUpdateHeaderAndDetails(

    IN p_id INT,

    IN p_header_info VARCHAR(255),

    IN p_header_info2 VARCHAR(255),

    IN p_created_by VARCHAR(255),

    IN p_modified_by VARCHAR(255),

    IN p_details JSON

)

BEGIN

    DECLARE v_header_id INT;


    -- Check if the header exists

    IF p_id IS NULL THEN

        -- Insert new header

        INSERT INTO header (header_info, header_info2, created_by, modified_by)

        VALUES (p_header_info, p_header_info2, p_created_by, p_modified_by);

        SET v_header_id = LAST_INSERT_ID();

    ELSE

        -- Update existing header

        UPDATE header

        SET header_info = p_header_info,

            header_info2 = p_header_info2,

            modified_by = p_modified_by

        WHERE id = p_id;

        SET v_header_id = p_id;

    END IF;


    -- Clear existing details for the header

    DELETE FROM detail WHERE header_id = v_header_id;


    -- Insert new details

    SET @json = p_details;

    INSERT INTO detail (header_id, detail_info, detail_info2, detail_info3, detail_info4)

    SELECT v_header_id, detail_info, detail_info2, detail_info3, detail_info4

    FROM JSON_TABLE(@json, '$[*]' 

        COLUMNS (

            detail_info VARCHAR(255) PATH '$.detail_info',

            detail_info2 VARCHAR(255) PATH '$.detail_info2',

            detail_info3 VARCHAR(255) PATH '$.detail_info3',

            detail_info4 VARCHAR(255) PATH '$.detail_info4'

        )

    ) AS details;


END //


DELIMITER ;

```


### Step 3: Example of Calling the Stored Procedure


You can call the stored procedure using the following SQL command:


```sql

CALL SaveOrUpdateHeaderAndDetails(

    NULL, -- For new header, use NULL

    'Header Info 1',

    'Header Info 2',

    'User 1',

    'User 1',

    '[{"detail_info": "Detail 1", "detail_info2": "Detail 2", "detail_info3": "Detail 3", "detail_info4": "Detail 4"}, {"detail_info": "Detail 5", "detail_info2": "Detail 6", "detail_info3": "Detail 7", "detail_info4": "Detail 8"}]'

);

```


### Step 4: PHP Example Using PDO


Certainly! Below is a complete PHP example that demonstrates how to use PDO to call the stored procedure we created earlier. This example includes error handling and assumes you have already set up your MySQL database and tables as described.


### PHP Example to Call the Stored Procedure


```php

<?php

// Database connection parameters

$host = 'localhost'; // Change if necessary

$db = 'your_database'; // Replace with your database name

$user = 'your_username'; // Replace with your database username

$pass = 'your_password'; // Replace with your database password

$charset = 'utf8mb4';


// Set up the Data Source Name (DSN)

$dsn = "mysql:host=$host;dbname=$db;charset=$charset";

$options = [

    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,

    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,

    PDO::ATTR_EMULATE_PREPARES   => false,

];


try {

    // Create a new PDO instance

    $pdo = new PDO($dsn, $user, $pass, $options);


    // Prepare the JSON data for details

    $details = json_encode([

        ['detail_info' => 'Detail 1', 'detail_info2' => 'Detail 2', 'detail_info3' => 'Detail 3', 'detail_info4' => 'Detail 4'],

        ['detail_info' => 'Detail 5', 'detail_info2' => 'Detail 6', 'detail_info3' => 'Detail 7', 'detail_info4' => 'Detail 8']

    ]);


    // Prepare the stored procedure call

    $stmt = $pdo->prepare("CALL SaveOrUpdateHeaderAndDetails(?, ?, ?, ?, ?, ?)");


    // Bind parameters

    $headerId = null; // Use null for a new header, or provide an existing ID to update

    $headerInfo = 'Header Info 1';

    $headerInfo2 = 'Header Info 2';

    $createdBy = 'User 1';

    $modifiedBy = 'User 1';


    // Execute the stored procedure

    $stmt->execute([$headerId, $headerInfo, $headerInfo2, $createdBy, $modifiedBy, $details]);


    echo "Header and details saved/updated successfully.";


} catch (PDOException $e) {

    // Handle any errors

    echo "Error: " . $e->getMessage();

}

?>

```


### Explanation of the Code


1. **Database Connection**: The script starts by defining the database connection parameters and creating a new PDO instance to connect to the MySQL database.


2. **JSON Data Preparation**: The details for the detail table are prepared as a JSON string. This is necessary because the stored procedure expects a JSON input for the details.


3. **Stored Procedure Call**: The script prepares a statement to call the stored procedure `SaveOrUpdateHeaderAndDetails`. It binds the parameters, including the header ID (which is `null` for a new header), header information, created and modified by fields, and the JSON string for details.


4. **Execution**: The stored procedure is executed with the provided parameters. If successful, a success message is displayed.


5. **Error Handling**: If there is an error during the execution, it is caught and displayed.


### Usage


- Make sure to replace the database connection parameters (`$host`, `$db`, `$user`, `$pass`) with your actual database credentials.

- You can change the `$headerId` variable to an existing header ID if you want to update an existing record instead of creating a new one.

- Save this script as a `.php` file and run it on a server with PHP and MySQL support.


This example should give you a good starting point for using stored procedures with PDO in PHP.


link to gist 

https://gist.github.com/ifirdausku/503dec090b2edf54b859f61890ac3d34

https://gist.github.com/ifirdausku/964fc9c105e382496fc570e6bae77785


blackbox ai with my prompt, (try it first)


Tidak ada komentar :

Posting Komentar