Wednesday, December 18, 2013

Storing Images in Oracle tables



Images and Oracle BLOB data are easy to add to a Oracle table. There are two ways to load BLOBs and CLOBs into the database. The first method uses PL/SQL and the DBMS_LOB package and the BFILE datatype to transfer external LOB files into the database internal LOB structures. The second uses the Oracle Call Interface (OCI) to perform the same function. Let's look at the first method.

To load external LOB data into internal LOB storage using PL/SQL alone you must first use a table containing BFILE locators for the files to allow Oracle to access them.

create table xx_images_tbl (
  file_id number,
  file_desc varchar2(30),
  file_loc bfile,
  file_type varchar2(15))
 /
Listing 3: Example Use of BFILE datatype in a Table

Notice in the above code that no LOB storage clause is specified. This is because all that is stored in the database is a locator value for the BFILE consisting of an internal DIRECTORY specification and a file name. The BFILE locators are loaded into the table using the BFILENAME function and a standard insert statement.
An example of this process is shown here in Listing 4.

INSERT INTO xx_images_tbl VALUES(1,'Test_file',bfilename('XX_DIR_NAME','TEST.JPG'),'JPEG');

commit;

Listing 4: Example Set of INSERT Commands to Load BFILE Locators Manually
TIP:
Using a host command to perform a single column directory listing into a file (for example on NT: dir /B >file.lis), then using the UTL_FILE package to read the contents of the created file into the DBMS_SQL package to build the INSERT commands on the fly, an entire directory of LOB datafiles can be loaded at one time into a BFILE table and then on into the internal LOB storage table. For an example see Listing 5.

CREATE OR REPLACE PROCEDURE xx_insert_images_proc(
   bfile_dir                  IN             VARCHAR2
 , bfile_lis                  IN             VARCHAR2
 , bfile_int_dir                             VARCHAR2
)
AS
   cur                                               INTEGER;
   bfile_int                                         VARCHAR2(100);
   sql_com                                           VARCHAR2(2000);
   file_proc                                         INTEGER;
   file_hand                                         UTL_FILE.file_type;
   file_buff                                         VARCHAR2(1022);
   file_type                                         VARCHAR2(4);
BEGIN
   bfile_int                                      := UPPER(bfile_int_dir);
   file_hand                                      := UTL_FILE.fopen(bfile_dir
                                                                  , bfile_lis
                                                                  , 'R'
                                                                   );

   LOOP
      BEGIN
         UTL_FILE.get_line(file_hand
                         , file_buff
                          );
         cur                                            := DBMS_SQL.open_cursor;
         file_type                                      := SUBSTR(file_buff
                                                                , INSTR(file_buff
                                                                      , '.'
                                                                       ) + 1
                                                                , 3
                                                                 );
         file_type                                      := UPPER(file_type);

         IF file_type = 'GIF'
         THEN
            file_type                                      := 'GIF';
         ELSIF file_type = 'JPG'
         THEN
            file_type                                      := 'JPEG';
         END IF;

         sql_com                                        :=
               'INSERT INTO xx_images_tbl '
            || CHR(10)
            || 'VALUES (xx_images_tbl_seq.NEXTVAL,'
            || CHR(39)
            || CHR(39)
            || ', bfilename('
            || CHR(39)
            || bfile_int
            || CHR(39)
            || ','
            || CHR(39)
            || file_buff
            || CHR(39)
            || ') ,'
            || CHR(39)
            || file_type
            || CHR(39)
            || ')';
         DBMS_OUTPUT.put_line(sql_com);
         DBMS_SQL.parse(cur
                      , sql_com
                      , DBMS_SQL.v7
                       );
         file_proc                                      := DBMS_SQL.EXECUTE(cur);
         DBMS_SQL.close_cursor(cur);
      EXCEPTION
         WHEN NO_DATA_FOUND
         THEN
            EXIT;
      END;
   END LOOP;

   UTL_FILE.fclose(file_hand);
END;
/
Listing 5: Example Procedure for Loading BFILE Locators based on an External File List
Once the BFILE locators are set in the BFILE table we can use the DBMS_LOB package to read the external LOB (BFILE) into an internal LOB (BLOB, CLOB or NCLOB). This is shown in Listing

 6. The SELECT from the TEMP_BLOB table initializes the internal LOB values so they can be used, otherwise an error will be returned.

CREATE OR REPLACE PROCEDURE load_lob
AS
   ID                                                NUMBER;
   image1                                            BLOB;
   LOCATOR                                           BFILE;
   bfile_len                                         NUMBER;
   bf_desc                                           VARCHAR2(30);
   bf_name                                           VARCHAR2(30);
   bf_dir                                            VARCHAR2(30);
   bf_typ                                            VARCHAR2(4);
   ctr                                               INTEGER;

   CURSOR get_id
   IS
      SELECT file_id
           , file_desc
           , file_type
        FROM xx_images_tbl;
BEGIN
   OPEN get_id;

   LOOP
      FETCH get_id
       INTO ID
          , bf_desc
          , bf_typ;

      EXIT WHEN get_id%NOTFOUND;
      DBMS_OUTPUT.put_line('ID: ' || TO_CHAR(ID));

      SELECT file_loc
        INTO LOCATOR
        FROM xx_images_tbl
       WHERE file_id = ID;

      DBMS_LOB.filegetname(LOCATOR
                         , bf_dir
                         , bf_name
                          );
      DBMS_OUTPUT.put_line('Dir: ' || bf_dir);
      DBMS_LOB.fileopen(LOCATOR
                      , DBMS_LOB.file_readonly
                       );
      bfile_len                                      := DBMS_LOB.getlength(LOCATOR);
      DBMS_OUTPUT.put_line('ID: ' || TO_CHAR(ID) || ' length: ' || TO_CHAR(bfile_len));

      SELECT temp_blob
        INTO image1
        FROM temp_blob;

      bfile_len                                      := DBMS_LOB.getlength(LOCATOR);
      DBMS_LOB.loadfromfile(image1
                          , LOCATOR
                          , bfile_len
                          , 1
                          , 1
                           );

      INSERT INTO xx_images_tbl
           VALUES (ID
                 , bf_desc
                 , image1
                 , bf_typ
                  );

      DBMS_OUTPUT.put_line(bf_desc || ' Length: ' || TO_CHAR(bfile_len) || ' Name: ' || bf_name || ' Dir: ' || bf_dir || ' ' || bf_typ);
      DBMS_LOB.fileclose(LOCATOR);
   END LOOP;
END;
/
/
Listing 6: Example Procedure to Load BFILE values into Internal LOBs
By enforcing a naming standard on the external LOB files the loading procedure in Listing 6.6 could be modified to place BLOB types into BLOBs, CLOB types into CLOBs and NCLOB types into NCLOBs based on the file type values that are parsed from the file extensions in Listing 5. Between the procedure in Listing 5 and the one shown in Listing 6 the example tables in Listings 1 and 3 are populated with LOB values located in a specific directory.

Tuesday, December 17, 2013

Query to get the Line Number for Covered Product in Oracle Service Contracts


SELECT lines.line_number || '.' || prd_lines.line_number line_number,to_char(prd_lines.id)
  FROM okc_k_headers_b hdr
     , okc_k_lines_b lines
     , okc_k_lines_b prd_lines
     , okc_k_items oki
WHERE 1 = 1
   AND lines.dnz_chr_id = hdr.ID
  AND lines.ID = oki.cle_id
   AND hdr.contract_number = :p_contract_number
   AND hdr.contract_number_modifier = :p_modifier
   AND lines.lse_id = 1
   AND prd_lines.dnz_chr_id = hdr.ID
   AND lines.ID = prd_lines.cle_id
   AND prd_lines.lse_id = 9;


Tuesday, November 26, 2013

Sample Script for Creating the List Price Using qp_price_list_pub.process_price_list

this Script is tested in 11.5.10.2, so please test the same before using it in your Production instance.

------- Script to Create the Price List Line (Line Type) For an Item In the Price List.
DECLARE
   x_return_status                                   VARCHAR2 (1) := NULL;
   x_msg_count                                       NUMBER := 0;
   x_msg_data                                        VARCHAR2 (2000);
   l_price_list_rec                                  qp_price_list_pub.price_list_rec_type;
   l_price_list_val_rec                              qp_price_list_pub.price_list_val_rec_type;
   l_price_list_line_tbl                             qp_price_list_pub.price_list_line_tbl_type;
   l_price_list_line_val_tbl                         qp_price_list_pub.price_list_line_val_tbl_type;
   l_qualifiers_tbl                                  qp_qualifier_rules_pub.qualifiers_tbl_type;
   l_qualifiers_val_tbl                              qp_qualifier_rules_pub.qualifiers_val_tbl_type;
   l_pricing_attr_tbl                                qp_price_list_pub.pricing_attr_tbl_type;
   l_pricing_attr_val_tbl                            qp_price_list_pub.pricing_attr_val_tbl_type;
   x_price_list_rec                                  qp_price_list_pub.price_list_rec_type;
   x_price_list_val_rec                              qp_price_list_pub.price_list_val_rec_type;
   x_price_list_line_tbl                             qp_price_list_pub.price_list_line_tbl_type;
   x_price_list_line_val_tbl                         qp_price_list_pub.price_list_line_val_tbl_type;
   x_qualifiers_tbl                                  qp_qualifier_rules_pub.qualifiers_tbl_type;
   x_qualifiers_val_tbl                              qp_qualifier_rules_pub.qualifiers_val_tbl_type;
   x_pricing_attr_tbl                                qp_price_list_pub.pricing_attr_tbl_type;
   x_pricing_attr_val_tbl                            qp_price_list_pub.pricing_attr_val_tbl_type;
   k                                                 NUMBER := 1;
   j                                                 NUMBER := 1;
BEGIN
   x_return_status                                                    := NULL;
   x_msg_count                                                        := NULL;
   x_msg_data                                                         := NULL;
   l_price_list_rec.list_header_id                                    := 6007;
   l_price_list_rec.list_type_code                                    := 'PRL';
   l_price_list_rec.operation                                         := qp_globals.g_opr_update;
   l_price_list_line_tbl (1).list_header_id                           := 6007;
   l_price_list_line_tbl (1).list_line_id                             := fnd_api.g_miss_num;
   l_price_list_line_tbl (1).list_line_type_code                      := 'PLL';
   l_price_list_line_tbl (1).operation                                := qp_globals.g_opr_create;
   l_price_list_line_tbl (1).operand                                  := 10;
   l_price_list_line_tbl (1).arithmetic_operator                      := 'UNIT_PRICE';
   l_price_list_line_tbl (1).start_date_active                        := '26-NOV-2013';
   l_price_list_line_tbl (1).organization_id                          := NULL;
   l_pricing_attr_tbl (1).pricing_attribute_id                        := fnd_api.g_miss_num;
   l_pricing_attr_tbl (1).list_line_id                                := fnd_api.g_miss_num;
   l_pricing_attr_tbl (1).product_attribute_context                   := 'ITEM';
   l_pricing_attr_tbl (1).product_attribute                           := 'PRICING_ATTRIBUTE1';
   l_pricing_attr_tbl (1).product_attr_value                          := '809342'; --- Inventory Item id
   l_pricing_attr_tbl (1).product_uom_code                            := 'Ea';
   l_pricing_attr_tbl (1).excluder_flag                               := 'N';
   l_pricing_attr_tbl (1).attribute_grouping_no                       := 1;
   l_pricing_attr_tbl (1).price_list_line_index                       := 1;
   l_pricing_attr_tbl (1).operation                                   := qp_globals.g_opr_create;
   DBMS_OUTPUT.put_line ('Calling qp_price_list_pub.process_price_list API to Define List Price For a Item');
   DBMS_OUTPUT.put_line ('*********************************************************************************');
   qp_price_list_pub.process_price_list (p_api_version_number          => 1
                                       , p_init_msg_list               => fnd_api.g_true
                                       , p_return_values               => fnd_api.g_false
                                       , p_commit                      => fnd_api.g_false
                                       , x_return_status               => x_return_status
                                       , x_msg_count                   => x_msg_count
                                       , x_msg_data                    => x_msg_data
                                       , p_price_list_rec              => l_price_list_rec
                                       , p_price_list_line_tbl         => l_price_list_line_tbl
                                       , p_pricing_attr_tbl            => l_pricing_attr_tbl
                                       , x_price_list_rec              => x_price_list_rec
                                       , x_price_list_val_rec          => x_price_list_val_rec
                                       , x_price_list_line_tbl         => x_price_list_line_tbl
                                       , x_qualifiers_tbl              => x_qualifiers_tbl
                                       , x_qualifiers_val_tbl          => x_qualifiers_val_tbl
                                       , x_pricing_attr_tbl            => x_pricing_attr_tbl
                                       , x_pricing_attr_val_tbl        => x_pricing_attr_val_tbl
                                       , x_price_list_line_val_tbl     => x_price_list_line_val_tbl
                                        );

   IF x_price_list_line_tbl.COUNT > 0
   THEN
      FOR k IN 1 .. x_price_list_line_tbl.COUNT
      LOOP
         DBMS_OUTPUT.put_line ('No Of Records Created Successfully : ' || k);
         DBMS_OUTPUT.put_line ('Return Status : ' || x_price_list_line_tbl (k).return_status);
         DBMS_OUTPUT.put_line ('List Line id : ' || x_price_list_line_tbl (k).list_line_id);
      END LOOP;
   END IF;

   IF x_price_list_line_tbl (k).return_status = fnd_api.g_ret_sts_success
   THEN
      COMMIT;
      DBMS_OUTPUT.put_line ('Item loaded successfully into the price list');
   ELSE
      ROLLBACK;
      DBMS_OUTPUT.put_line ('Error While Loading Item in Ptice List');
   END IF;

   FOR k IN 1 .. x_msg_count
   LOOP
      x_msg_data                                                         :=
                                                                         oe_msg_pub.get (p_msg_index                   => k
                                                                                       , p_encoded                     => 'F');
      DBMS_OUTPUT.put_line ('Error While Loading Item in Ptice List : ' || k || ' is: ' || x_msg_data);
   END LOOP;
END;


---- Script to Create the Price Break Header Line type with Price Breaks.

DECLARE
   gpr_return_status                                 VARCHAR2 (1) := NULL;
   gpr_msg_count                                     NUMBER := 0;
   gpr_msg_data                                      VARCHAR2 (2000);
   gpr_price_list_rec                                qp_price_list_pub.price_list_rec_type;
   gpr_price_list_line_tbl                           qp_price_list_pub.price_list_line_tbl_type;
   gpr_pricing_attr_tbl                              qp_price_list_pub.pricing_attr_tbl_type;
   ppr_price_list_rec                                qp_price_list_pub.price_list_rec_type;
   ppr_price_list_val_rec                            qp_price_list_pub.price_list_val_rec_type;
   ppr_price_list_line_tbl                           qp_price_list_pub.price_list_line_tbl_type;
   ppr_price_list_line_val_tbl                       qp_price_list_pub.price_list_line_val_tbl_type;
   ppr_pricing_attr_tbl                              qp_price_list_pub.pricing_attr_tbl_type;
   ppr_pricing_attr_val_tbl                          qp_price_list_pub.pricing_attr_val_tbl_type;
   ppr_qualifiers_tbl                                qp_qualifier_rules_pub.qualifiers_tbl_type;
   ppr_qualifiers_val_tbl                            qp_qualifier_rules_pub.qualifiers_val_tbl_type;
   k                                                 NUMBER := 1;
   j                                                 NUMBER := 1;
   i                                                 NUMBER := 1;
BEGIN
   gpr_price_list_rec.list_header_id                                  := 6007;
   gpr_price_list_rec.list_type_code                                  := 'PRL';
   gpr_price_list_rec.currency_code                                   := 'USD';
   gpr_price_list_rec.operation                                       := qp_globals.g_opr_update;
   k                                                                  := 1;
   gpr_price_list_line_tbl (k).list_line_id                           := fnd_api.g_miss_num;
   gpr_price_list_line_tbl (k).list_line_type_code                    := 'PBH';
   gpr_price_list_line_tbl (k).price_break_type_code                  := 'POINT';
   gpr_price_list_line_tbl (k).operation                              := qp_globals.g_opr_create;
   gpr_price_list_line_tbl (k).product_precedence                     := 220;
   gpr_price_list_line_tbl (k).arithmetic_operator                    := 'UNIT_PRICE';
   j                                                                  := 1;
   gpr_pricing_attr_tbl (j).pricing_attribute_id                      := fnd_api.g_miss_num;
   gpr_pricing_attr_tbl (j).list_line_id                              := fnd_api.g_miss_num;
   gpr_pricing_attr_tbl (j).product_attribute_context                 := 'ITEM';
   gpr_pricing_attr_tbl (j).product_attribute                         := 'PRICING_ATTRIBUTE1';
   gpr_pricing_attr_tbl (j).product_attr_value                        := '797346';
   gpr_pricing_attr_tbl (j).product_uom_code                          := 'Ea';
   gpr_pricing_attr_tbl (j).excluder_flag                             := 'N';
   gpr_pricing_attr_tbl (j).price_list_line_index                     := 1;
   gpr_pricing_attr_tbl (j).operation                                 := qp_globals.g_opr_create;
   k                                                                  := k + 1;
   gpr_price_list_line_tbl (k).list_line_id                           := fnd_api.g_miss_num;
   gpr_price_list_line_tbl (k).list_line_type_code                    := 'PLL';
   gpr_price_list_line_tbl (k).operation                              := qp_globals.g_opr_create;
   gpr_price_list_line_tbl (k).operand                                := 10;
   gpr_price_list_line_tbl (k).arithmetic_operator                    := 'UNIT_PRICE';
   gpr_price_list_line_tbl (k).rltd_modifier_group_no                 := 1;
   gpr_price_list_line_tbl (k).product_precedence                     := 220;
   gpr_price_list_line_tbl (k).price_break_header_index               := 1;
   j                                                                  := j + 1;
   gpr_pricing_attr_tbl (j).pricing_attribute_id                      := fnd_api.g_miss_num;
   gpr_pricing_attr_tbl (j).list_line_id                              := fnd_api.g_miss_num;
   gpr_pricing_attr_tbl (j).product_attribute_context                 := 'ITEM';
   gpr_pricing_attr_tbl (j).product_attribute                         := 'PRICING_ATTRIBUTE1';
   gpr_pricing_attr_tbl (j).product_attr_value                        := '797346';
   gpr_pricing_attr_tbl (j).product_uom_code                          := 'Ea';
   gpr_pricing_attr_tbl (j).pricing_attribute_context                 := 'VOLUME';
   gpr_pricing_attr_tbl (j).pricing_attribute                         := 'PRICING_ATTRIBUTE10';
   gpr_pricing_attr_tbl (j).pricing_attr_value_from                   := '1';
   gpr_pricing_attr_tbl (j).pricing_attr_value_to                     := '20';
   gpr_pricing_attr_tbl (j).comparison_operator_code                  := 'BETWEEN';
   gpr_pricing_attr_tbl (j).excluder_flag                             := 'N';
   gpr_pricing_attr_tbl (j).price_list_line_index                     := 2;
   gpr_pricing_attr_tbl (j).operation                                 := qp_globals.g_opr_create;
   gpr_msg_data                                                       := NULL;
   DBMS_OUTPUT.put_line ('Calling qp_price_list_pub.process_price_list API to Define List Price For a Item');
   DBMS_OUTPUT.put_line ('*********************************************************************************');
   qp_price_list_pub.process_price_list (p_api_version_number          => 1
                                       , p_init_msg_list               => fnd_api.g_true
                                       , p_return_values               => fnd_api.g_false
                                       , p_commit                      => fnd_api.g_false
                                       , x_return_status               => gpr_return_status
                                       , x_msg_count                   => gpr_msg_count
                                       , x_msg_data                    => gpr_msg_data
                                       , p_price_list_rec              => gpr_price_list_rec
                                       , p_price_list_line_tbl         => gpr_price_list_line_tbl
                                       , p_pricing_attr_tbl            => gpr_pricing_attr_tbl
                                       , x_price_list_rec              => ppr_price_list_rec
                                       , x_price_list_val_rec          => ppr_price_list_val_rec
                                       , x_price_list_line_tbl         => ppr_price_list_line_tbl
                                       , x_price_list_line_val_tbl     => ppr_price_list_line_val_tbl
                                       , x_qualifiers_tbl              => ppr_qualifiers_tbl
                                       , x_qualifiers_val_tbl          => ppr_qualifiers_val_tbl
                                       , x_pricing_attr_tbl            => ppr_pricing_attr_tbl
                                       , x_pricing_attr_val_tbl        => ppr_pricing_attr_val_tbl
                                        );

   IF ppr_price_list_line_tbl.COUNT > 0
   THEN
      FOR k IN 1 .. ppr_price_list_line_tbl.COUNT
      LOOP
         DBMS_OUTPUT.put_line ('No Of Records Created Successfully : ' || k);
         DBMS_OUTPUT.put_line ('Return Status : ' || ppr_price_list_line_tbl (k).return_status);
         DBMS_OUTPUT.put_line ('List Line id : ' || ppr_price_list_line_tbl (k).list_line_id);
      END LOOP;
   END IF;

   IF gpr_return_status <> fnd_api.g_ret_sts_success
   THEN
      RAISE fnd_api.g_exc_unexpected_error;
   ELSE
      COMMIT;
   END IF;
EXCEPTION
   WHEN fnd_api.g_exc_error
   THEN
      gpr_return_status                                                  := fnd_api.g_ret_sts_error;
      DBMS_OUTPUT.put_line ('err msg 1 is : ' || gpr_msg_data);
   WHEN fnd_api.g_exc_unexpected_error
   THEN
      gpr_return_status                                                  := fnd_api.g_ret_sts_unexp_error;
      DBMS_OUTPUT.put_line (' msg count 2 is : ' || gpr_msg_count);

      FOR k IN 1 .. gpr_msg_count
      LOOP
         gpr_msg_data                                                       :=
                                                                         oe_msg_pub.get (p_msg_index                   => k
                                                                                       , p_encoded                     => 'F');
         DBMS_OUTPUT.put_line ('err msg ' || k || 'is:  ' || gpr_msg_data);
      END LOOP;
   WHEN OTHERS
   THEN
      gpr_return_status                                                  := fnd_api.g_ret_sts_unexp_error;
      DBMS_OUTPUT.put_line ('err msg 3 is : ' || gpr_msg_data);
END;
/

---- Script to Create the Price Break Header Line type with Price Breaks and attributes.

DECLARE
   x_return_status                                   VARCHAR2 (1) := NULL;
   x_msg_count                                       NUMBER := 0;
   x_msg_data                                        VARCHAR2 (2000);
   l_price_list_rec                                  qp_price_list_pub.price_list_rec_type;
   l_price_list_line_tbl                             qp_price_list_pub.price_list_line_tbl_type;
   l_pricing_attr_tbl                                qp_price_list_pub.pricing_attr_tbl_type;
   x_price_list_rec                                  qp_price_list_pub.price_list_rec_type;
   x_price_list_val_rec                              qp_price_list_pub.price_list_val_rec_type;
   x_price_list_line_tbl                             qp_price_list_pub.price_list_line_tbl_type;
   x_price_list_line_val_tbl                         qp_price_list_pub.price_list_line_val_tbl_type;
   x_pricing_attr_tbl                                qp_price_list_pub.pricing_attr_tbl_type;
   x_pricing_attr_val_tbl                            qp_price_list_pub.pricing_attr_val_tbl_type;
   x_qualifiers_tbl                                  qp_qualifier_rules_pub.qualifiers_tbl_type;
   x_qualifiers_val_tbl                              qp_qualifier_rules_pub.qualifiers_val_tbl_type;
   k                                                 NUMBER := 1;
   j                                                 NUMBER := 1;
   i                                                 NUMBER := 1;
BEGIN
   /* set the list_header_id to g_miss_num */
   l_price_list_rec.list_header_id                                    := 6007;
   l_price_list_rec.list_type_code                                    := 'PRL';
/* you can set the currency of price list to whatever, say FRA */
   l_price_list_rec.currency_code                                     := 'USD';
   l_price_list_rec.operation                                         := qp_globals.g_opr_update;
   --Create a Price List Line of type 'PBH'
   k                                                                  := 1;
   l_price_list_line_tbl (k).list_line_id                             := fnd_api.g_miss_num;
   l_price_list_line_tbl (k).list_line_type_code                      := 'PBH';
   l_price_list_line_tbl (k).price_break_type_code                    := 'POINT';
   l_price_list_line_tbl (k).operation                                := qp_globals.g_opr_create;
   l_price_list_line_tbl (k).operand                                  := 10;
   l_price_list_line_tbl (k).arithmetic_operator                      := 'UNIT_PRICE';
   /*
     product_attr_value stores inventory item id -product_attribute for Item Number is Pricing_Attribute1
     product_attribute_context is ITEM . Each line can have one or more pricing attributes. we use
     PRICE_LIST_LINE_INDEX to link the child(pricing attributes ) to the parent(line). When you have pricing attributes like color,
     length, width etc, populate the fields pricing_attribute_context, pricing_attribute , pricing_attr_value_from, pricing_attr_value_to and
     comparison_operator_code ( '=' or 'between') and repeat the product_attr_value and its attribute and context for each record. */
   j                                                                  := 1;
   /* Pricing Attribute( with only Product information) record for Price List Line of type 'PBH' */
   l_pricing_attr_tbl (j).pricing_attribute_id                        := fnd_api.g_miss_num;
   l_pricing_attr_tbl (j).list_line_id                                := fnd_api.g_miss_num;
   l_pricing_attr_tbl (j).product_attribute_context                   := 'ITEM';
   l_pricing_attr_tbl (j).product_attribute                           := 'PRICING_ATTRIBUTE1';
   l_pricing_attr_tbl (j).product_attr_value                          := '809346';
   l_pricing_attr_tbl (j).product_uom_code                            := 'Ea';
   l_pricing_attr_tbl (j).excluder_flag                               := 'N';
   l_pricing_attr_tbl (j).price_list_line_index                       := 1;
   l_pricing_attr_tbl (j).operation                                   := qp_globals.g_opr_create;
   j                                                                  := j + 1;
   /* Pricing Attribute( non Product) record for Price List Line of type 'PBH' */
   l_pricing_attr_tbl (j).pricing_attribute_id                        := fnd_api.g_miss_num;
   l_pricing_attr_tbl (j).list_line_id                                := fnd_api.g_miss_num;
   l_pricing_attr_tbl (j).product_attribute_context                   := 'ITEM';
   l_pricing_attr_tbl (j).product_attribute                           := 'PRICING_ATTRIBUTE1';
   l_pricing_attr_tbl (j).product_attr_value                          := '809346';
   l_pricing_attr_tbl (j).product_uom_code                            := 'Ea';
   l_pricing_attr_tbl (j).pricing_attribute_context                   := 'SERV_DURATION';
   l_pricing_attr_tbl (j).pricing_attribute                           := 'PRICING_ATTRIBUTE1';
   l_pricing_attr_tbl (j).pricing_attr_value_from                     := '1';
   l_pricing_attr_tbl (j).pricing_attr_value_to                       := '10';
   l_pricing_attr_tbl (j).comparison_operator_code                    := 'BETWEEN';
   l_pricing_attr_tbl (j).excluder_flag                               := 'N';
   l_pricing_attr_tbl (j).price_list_line_index                       := 1;
   l_pricing_attr_tbl (j).operation                                   := qp_globals.g_opr_create;

   --Create a Price List Line of type 'PLL', a child price break line
   k                                                                  := k + 1;
   l_price_list_line_tbl (k).list_line_id                             := fnd_api.g_miss_num;
   l_price_list_line_tbl (k).list_line_type_code                      := 'PLL';
   l_price_list_line_tbl (k).operation                                := qp_globals.g_opr_create;
   l_price_list_line_tbl (k).operand                                  := 10;
   l_price_list_line_tbl (k).arithmetic_operator                      := 'UNIT_PRICE';
   l_price_list_line_tbl (k).rltd_modifier_group_no                   := 1;
   l_price_list_line_tbl (k).price_break_header_index                 := 1;
   -- This must point to the PBH line. In this example this is a child of the PBH above where K=1.
   --Create a Pricing Attribute with pricing context as 'Volume' and Pricing Attribute as 'Item Quantity''
   --needed to complete the creation of a child price break line.
   j                                                                  := j + 1;
   /* Pricing Attribute( with specific pricing attribute context and attribute) record
    for Price List Line of type 'PLL' which is a child Price Break Line */
   l_pricing_attr_tbl (j).pricing_attribute_id                        := fnd_api.g_miss_num;
   l_pricing_attr_tbl (j).list_line_id                                := fnd_api.g_miss_num;
   l_pricing_attr_tbl (j).product_attribute_context                   := 'ITEM';
   l_pricing_attr_tbl (j).product_attribute                           := 'PRICING_ATTRIBUTE1';
   l_pricing_attr_tbl (j).product_attr_value                          := '809346';
   l_pricing_attr_tbl (j).product_uom_code                            := 'Ea';
   l_pricing_attr_tbl (j).pricing_attribute_context                   := 'VOLUME';
   l_pricing_attr_tbl (j).pricing_attribute                           := 'PRICING_ATTRIBUTE10';   --'Item Quantity'
   l_pricing_attr_tbl (j).pricing_attr_value_from                     := '10';
   l_pricing_attr_tbl (j).pricing_attr_value_to                       := '20';
   l_pricing_attr_tbl (j).comparison_operator_code                    := 'BETWEEN';
   l_pricing_attr_tbl (j).excluder_flag                               := 'N';
   l_pricing_attr_tbl (j).price_list_line_index                       := 2;
   --Because this is a pricing attribute of the line K = 2
   l_pricing_attr_tbl (j).operation                                   := qp_globals.g_opr_create;
   DBMS_OUTPUT.put_line ('Calling qp_price_list_pub.process_price_list API to Define List Price For a Item');
   DBMS_OUTPUT.put_line ('*********************************************************************************');
   qp_price_list_pub.process_price_list (p_api_version_number          => 1
                                       , p_init_msg_list               => fnd_api.g_false
                                       , p_return_values               => fnd_api.g_false
                                       , p_commit                      => fnd_api.g_false
                                       , x_return_status               => x_return_status
                                       , x_msg_count                   => x_msg_count
                                       , x_msg_data                    => x_msg_data
                                       , p_price_list_rec              => l_price_list_rec
                                       , p_price_list_line_tbl         => l_price_list_line_tbl
                                       , p_pricing_attr_tbl            => l_pricing_attr_tbl
                                       , x_price_list_rec              => x_price_list_rec
                                       , x_price_list_val_rec          => x_price_list_val_rec
                                       , x_price_list_line_tbl         => x_price_list_line_tbl
                                       , x_price_list_line_val_tbl     => x_price_list_line_val_tbl
                                       , x_qualifiers_tbl              => x_qualifiers_tbl
                                       , x_qualifiers_val_tbl          => x_qualifiers_val_tbl
                                       , x_pricing_attr_tbl            => x_pricing_attr_tbl
                                       , x_pricing_attr_val_tbl        => x_pricing_attr_val_tbl
                                        );

   IF x_return_status <> fnd_api.g_ret_sts_success
   THEN
      RAISE fnd_api.g_exc_unexpected_error;
   ELSE
      COMMIT;
   END IF;
EXCEPTION
   WHEN fnd_api.g_exc_error
   THEN
      x_return_status                                                    := fnd_api.g_ret_sts_error;
   WHEN fnd_api.g_exc_unexpected_error
   THEN
      x_return_status                                                    := fnd_api.g_ret_sts_unexp_error;

      FOR k IN 1 .. x_msg_count
      LOOP
         x_msg_data                                                         :=
                                                                         oe_msg_pub.get (p_msg_index                   => k
                                                                                       , p_encoded                     => 'F');
         DBMS_OUTPUT.put_line ('err msg ' || k || 'is:  ' || x_msg_data);
      END LOOP;
   WHEN OTHERS
   THEN
      x_return_status                                                    := fnd_api.g_ret_sts_unexp_error;
END;
/